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


首先要導入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 frame
13     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         else
37         {
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 的結果:

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM