首页 > 代码库 > Unity 3D 中自动寻路 和 跟随转向 探析

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

 欧拉角旋转函数 和 四元数旋转函数 都能实现实时指向旋转  但是四元数的效果更好  细节也更细腻

Unity 3D 中自动寻路 和 跟随转向 探析