unity——使用角色控制器組件+射線移動

來源:互聯網
上載者:User

標籤:

首先要匯入unity標準資源套件Character Controllers 這個標準資源套件,為了方便,還添加了兩外一個資源套件Scripts,後者包含了一些基本的指令碼個攝像機指令碼。

沒錯,這次我們要使用其中一個攝像機指令碼, 建立一個terrain (地形ller組件(如),建立一個capsule ,並為這個膠囊提添加 CharactContro果沒有匯入角色標準資源套件的話竟不能被添加該組件),注意只是一個CharactController 組件而已。

當我們點擊 add Component——Character的時候會有以下三個選項,第一個是第一人稱視角,後面兩個是第三人稱視角。有什麼區別,還沒有去研究:

 

比如我們添加了第一個“CharacterMotor” ,添加以後系統自動為我們添加了包含 CharactorController 組件在內的兩個組件。這裡我們只需要CharacterController 這個組件,要把另外一個刪除掉。如果添加了後面兩個“FPS Input Controller” 或者 “Platform Input Controller”同樣也是要刪除多餘的只剩下 CharacterController  這個組件。因為我們只是用到了 

CharacterController.Move這個函數

function Move (motion : Vector3) : CollisionFlags

對這個函數的描述我也沒看太懂,大概是按照參數的方向移動了參數的長度、、、、、、吧0.0

這個組件只是為控制他移動提供了基礎。要想實現移動還要我們添加一個移動的指令碼,於是這個叫做 MyController 的指令碼誕生了。

上代碼:

 1 using UnityEngine; 2 using System.Collections; 3  4 public class MyController : MonoBehaviour { 5     private Vector3 mousePoint; 6     public float speed=0.1f; 7     // Use this for initialization 8     void Start () { 9     10     }11     12     // Update is called once per frame13     void Update () {14     if (Input.GetMouseButtonDown(0)) {15             Ray myRay=Camera.main.ScreenPointToRay(Input.mousePosition);16             RaycastHit hit;17 18             if (Physics.Raycast(myRay,out hit)) {19                 mousePoint=hit.point;20                 transform.LookAt(new Vector3(mousePoint.x,transform.position.y,mousePoint.z) );21             }22 23             print(Vector3.Distance(mousePoint,transform.position));24         }25         Move(speed);26     }27 28     void Move(float speed)29     {30         if (Mathf.Abs(Vector3.Distance(transform.position,mousePoint))>=1f) {31 32             CharacterController controller = GetComponent<CharacterController>();33             Vector3 v=Vector3.ClampMagnitude(mousePoint-transform.position,speed);34             controller.Move(v);35         }36         else37         {38             Debug.Log("已到達終點");39         }40 41     }42 }

 第 30行 Vector3.Distance 這個函數的解釋:

static function Distance (a : Vector3, b : Vector3) : float

這個函數返回 a、b 兩點之間的距離,這個距離永遠是正值!!

官方的解釋,這個函數等同於(a-b).magnitude而(a-b).magnitude是怎麼計算的呢?看下面:

Vector3.magnitude

返迴向量的長度(唯讀)。向量的長度是(x*x+y*y+z*z)的平方根。

由此可知。返回永遠都不可能是負值。

所以,代碼中第30行的 Mathf.Abs  取絕對值的函數是沒有必要的。

另外第33行也有一個函數:

Vector3.ClampMagnitude

這個函數的描述:

static function ClampMagnitude (vector : Vector3, maxLength : float) : Vector3

返迴向量的長度,最大不超過maxLength所指示的長度。

也就是說,鉗制向量長度到一個特定的長度。

呦描述可知,該方法返回了一個vector3類型的值,這個向量可以看做是第一個參數的副本,但是有一點:它的長度被第二個參數限制了。

下面來看看run 的結果:

 

無法上傳運行圖片。。。暈

unity——使用角色控制器組件+射線移動

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.