• SurvivalShooter学习笔记(二.玩家移动旋转)


    该案例中:(PC端操作)

    1.玩家移动输入控制通过虚拟轴Axis,旋转输入控制通过鼠标位置;

    2.玩家始终面朝鼠标停留点,鼠标停留点通过摄像机朝地面的射线获取;

    3.玩家待机移动状态切换通过Animator组件;

    4.玩家移动旋转通过身上刚体组件及其相关函数。

    public class PlayerMovement : MonoBehaviour
        {
            public float speed = 6f;            //玩家移动速度
    
            Vector3 movement;                   // 玩家移动临时变量
            Animator anim;                      //玩家身上动画控制器
            Rigidbody playerRigidbody;          //玩家身上刚体组件
            int floorMask;                      // 地板的Layer层
            float camRayLength = 100f;          // 相机射线的长度
    
            void Awake ()
            {
                // 获取Floor层的值
                floorMask = LayerMask.GetMask ("Floor");
                // 获取玩家身上各组件
                anim = GetComponent <Animator> ();
                playerRigidbody = GetComponent <Rigidbody> ();
            }
    
    	
            void FixedUpdate ()
            {
                //每帧获取玩家输入的虚拟轴,水平垂直值
                float h = Input.GetAxisRaw("Horizontal");
                float v = Input.GetAxisRaw("Vertical");
    
                // 根据水平垂直输入量移动玩家
                Move (h, v);
    
                //旋转玩家
                Turning ();
    
                // 根据输入的值播放相应状态动画
                Animating (h, v);
            }
    
            void Move (float h, float v)
            {
                //根据输入的虚拟轴值设置变量
                movement.Set (h, 0f, v);
                
                // 单位化位移向量并根据速度得到需要移动的向量
                movement = movement.normalized * speed * Time.deltaTime;
    
                // 根据移动向量 移动玩家到相应位置
                playerRigidbody.MovePosition (transform.position + movement);
            }
    
            void Turning ()
            {
                //创建射线,摄像机指向鼠标点
                Ray camRay = Camera.main.ScreenPointToRay (Input.mousePosition);
    
                RaycastHit floorHit;
    
                //如果点到了地面
                if(Physics.Raycast (camRay, out floorHit, camRayLength, floorMask))
                {
                    // 创建 从玩家 到地面上鼠标点到的点 的向量
                    Vector3 playerToMouse = floorHit.point - transform.position;
    
                    //确保该向量是沿着地表水平的
                    playerToMouse.y = 0f;
    
                    // 创建玩家指向点击点的旋转值
                    Quaternion newRotatation = Quaternion.LookRotation (playerToMouse);
    
                    //设置玩家的旋转
                    playerRigidbody.MoveRotation (newRotatation);
                }
            }
    	
            void Animating (float h, float v)
            {
                // 获取是否有唯一的bool
                bool walking = h != 0f || v != 0f;
    
                //设置对应状态机的值
                anim.SetBool ("IsWalking", walking);
            }
        }



    玩家状态机切换:


    ccsd




  • 相关阅读:
    23种设计模式之原子模式
    23种设计模式之外观模式(门面模式)
    Docker指令记录
    mysql 引擎
    G1调优随笔
    jvm面试题 新生代和 老年代的区别
    java虚拟机栈 相关操作
    .net大法总章
    .net趣味面试题总结
    IOC控制反转-依赖注入
  • 原文地址:https://www.cnblogs.com/caymanlu/p/6361690.html
Copyright © 2020-2023  润新知