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

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

  • 相关阅读:
    我用柔软打败你
    【记录】ASP.NET URL 特殊字符
    再次记录 Visual Studio 2015 CTP 5 的一个坑
    【记录】ASP.NET MVC View 移动版浏览的奇怪问题
    升级 Visual Studio 2015 CTP 5 的坑、坑、坑
    OWIN 中 K Commands 与 OwinHost.exe 相等吗?
    OWIN 中 K Commands(OwinHost.exe)与 Microsoft.AspNet.Hosting 的角色问题
    深入理解 OWIN 中的 Host 和 Server
    【续集】在 IIS 中部署 ASP.NET 5 应用程序遭遇的问题
    delete
  • 原文地址:https://www.cnblogs.com/qiaogaojian/p/5917475.html
Copyright © 2020-2023  润新知