zoukankan      html  css  js  c++  java
  • 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;
        }
        
    }
    

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

  • 相关阅读:
    Linux 期中架构 PHP
    Linux 期中架构 MySQL
    Python 示例 饮水记录
    Linux 期中架构 inotify
    Linux期中架构 全网备份案例
    分布式存储系统Ceph部署过程 · Jayden's Blog
    Go语言汇编器的设计
    linux基础3
    6.2.2 多余的列另起一行
    linux网络设备驱动2
  • 原文地址:https://www.cnblogs.com/qiaogaojian/p/5917475.html
Copyright © 2011-2022 走看看