這里主要講三個函數 , 一個自動跟隨函數 和 兩個指向旋轉函數 , 這三個函數在游戲角色創建過程中會經常用到:
這個是跟隨函數 和 歐拉角旋轉函數
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;
}
}
歐拉角旋轉函數 和 四元數旋轉函數 都能實現實時指向旋轉 但是四元數的效果更好 細節也更細膩
