標籤:
首先要匯入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——使用角色控制器組件+射線移動