Unity 3D 中自動尋路 和 跟隨轉向 探析


這里主要講三個函數 , 一個自動跟隨函數 和 兩個指向旋轉函數 , 這三個函數在游戲角色創建過程中會經常用到:

這個是跟隨函數 和 歐拉角旋轉函數

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;
    }
    
}

 歐拉角旋轉函數 和 四元數旋轉函數 都能實現實時指向旋轉  但是四元數的效果更好  細節也更細膩


免責聲明!

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



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