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

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

posted @ 2016-09-28 18:08  乔高建  阅读(4267)  评论(1编辑  收藏  举报