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




原文地址:https://www.cnblogs.com/caymanlu/p/6361690.html