這里主要講三個函數 , 一個自動跟隨函數 和 兩個指向旋轉函數 , 這三個函數在游戲角色創建過程中會經常用到:
這個是跟隨函數 和 歐拉角旋轉函數
public class GensuiZhixiang : MonoBehaviour { //公共屬性 //定義跟隨主體的Transform Transform m_transform; //定義被跟隨(指向)物體的Transform public Transform target; //跟隨類 //定義跟隨主體的移動速度 float m_speed = 10f; //指向類 //定義跟隨主體的轉向角度 float m_rotSpeed = 120f; // Use this for initialization void Start () { //獲取自身Transform m_transform = this.transform; } // Update is called once per frame void Update () { //調用跟隨函數 Follow(); //調用指向函數 LookAt(); } //跟隨函數 void Follow() { //定義跟隨主體原來的位置(還沒有跟隨移動) Vector3 oldPosition = m_transform.position; //定義被跟隨物體的的位置 Vector3 targetPosition = target.position; //得到XYZ軸上的向量 float x = Mathf.MoveTowards(oldPosition.x, targetPosition.x, m_speed * Time.deltaTime); float y = Mathf.MoveTowards(oldPosition.y, targetPosition.y, m_speed * Time.deltaTime); float z = Mathf.MoveTowards(oldPosition.z, targetPosition.z, m_speed * Time.deltaTime); //把得到的向量賦給跟隨主體 實現跟隨 m_transform.position = new Vector3(x,y,z); } //指向函數 void LookAt() { //定義指向主體原來的角度(還沒有旋轉) Vector3 oldOEuler = m_transform.eulerAngles; //指向主體坐標 轉向 被指向物體 m_transform.LookAt(target.transform); //得到面向物體的歐拉角(只需要XY就能實現指向了) float eulerX = Mathf.MoveTowardsAngle(oldOEuler.x, m_transform.eulerAngles.x, m_rotSpeed * Time.deltaTime); float eulerY = Mathf.MoveTowardsAngle(oldOEuler.y, m_transform.eulerAngles.y, m_rotSpeed * Time.deltaTime); //把得到的旋轉量賦給主體 實現指向 m_transform.eulerAngles = new Vector3(eulerX, eulerY, 0); } }
這個是 四元數旋轉函數
public class QuaternionLookat : MonoBehaviour { //定義被指向主體的Transform Transform m_transform; //定義被指向物體的Transform public Transform target; // Use this for initialization void Start () { //初始化給主體賦Transform m_transform = this.transform; } // Update is called once per frame void Update () { //調用旋轉函數 QuaterLook(); } //四元數旋轉函數 void QuaterLook() { //定義一個三維變量 用來表示從本體 到 客體的向量 Vector3 pos = target.position - m_transform.position; //用四元數的LookRotation() 獲得轉向的四元數 Quaternion m_rotation = Quaternion.LookRotation(pos); //把得到的旋轉量 賦給旋轉本體 實現指向旋轉 (注意這里的.localRotation 而不是.rotation 因為前者能實現旋轉 后者不行) m_transform.localRotation = m_rotation; } }
歐拉角旋轉函數 和 四元數旋轉函數 都能實現實時指向旋轉 但是四元數的效果更好 細節也更細膩