SurvivalShooter學習筆記(二.玩家移動旋轉)

庸人自擾Eam發表於2017-01-02

該案例中:(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




相關文章