Unity——第一人稱控制器的實現


Unity——第一人稱控制器的實現

一、功能描述

在一個場景中實現人物的前后左右移動和跳躍功能;其中前后左右移動通過W、A、S、D方向鍵實現,跳躍功能通過空格鍵實現,並且考慮到重力作用,來調節跳躍功能。

二、功能實現

2.1創建一個Character Controller

  1. 先創建一個新的GameObject,並重命名為Player

  2. 並為其添加一個Character Controller組件

  3. 在Player下,創建一個Cylinder物體(代替人物),並將場景中的主相機(Main Camera)放於Player下

將Cylinder物體中的Capsule Collider組件刪除,解決碰撞問題。

2.2實現相機(第一人稱視角的旋轉,左右)的移動

相機的視角通過鼠標mouse進行控制

  1. Assets文件夾下創建Scripts文件夾,用來保存代碼文件;並在Scripts文件夾下創建CameraMove的C#文件並打開;

  2. 直接放代碼,相關解釋在代碼里:

    //所有代碼如下:
    public class CameraMove : MonoBehaviour
    {
        //定義鼠標移動速度
        public float mouseSpeed = 100f;
        
        public Transform playerBody;
    ​
        float xRotation = 0f;
        // Start is called before the first frame update
        void Start()
        {
            //將鼠標隱藏
            Cursor.lockState = CursorLockMode.Locked;
        }
    ​
        // Update is called once per frame
        void Update()
        {
            float mouseX = Input.GetAxisRaw("Mouse X") * mouseSpeed * Time.deltaTime;
            float mouseY = Input.GetAxisRaw("Mouse Y") * mouseSpeed * Time.deltaTime;
            //這里的Mouse X和Mouse Y是鼠標所控制的X,Y,這里在前面新定義了一個鼠標移動的速度mouseSpeed,用來控制鼠標移動速度,Time.deltaTime是為了解決幀率問題
            xRotation -= mouseY;//不能為+=,會讓鼠標控制的攝像機方向顛倒
            xRotation = Mathf.Clamp(xRotation, -90f, 90f);//將攝像機上下可調節范圍控制在-90到90度之間
    ​
            transform.localRotation = Quaternion.Euler(xRotation, 0f, 0f);
            playerBody.Rotate(Vector3.up * mouseX);//繞着y軸旋轉
    ​
        }
    }

     

     
  3. 注意:攝像機和物體Cylinder的y軸差距不要很大,很大的話會出現問題,盡量重合。

  4. 保存文件,並將Camera Move文件作為組件添加給主攝像機,並把Player拖入到Player Body上,如圖:

     

     

     

     

  5. 運行並調試,攝像機可以根據鼠標運動而改變視野角度。

2.3人物左右移動和跳躍

同上,在Assets文件夾下創建Scripts文件夾,用來保存代碼文件;並在Scripts文件夾下創建Player Movement的C#文件並打開

直接上代碼:

public class PlayerMovement : MonoBehaviour
{
    public CharacterController controller;
    
    //這里是人物行走時的速度
    public float walkSpeed = 5f;
    
    //人物跑動時的速度
    public float runSpeed = 6f;
    
    //重力
    public float gravity = -9.81f;
    
    //三維向量組x,y,z
    Vector3 velocity;
​
    public Transform groundCheck;
    
    //檢測人物是否與地面碰撞的半徑
    public float groundDistance = 0.4f;
​
    public LayerMask groundMask;
    
    //人物是否在地面上
    bool isGrounded;
​
    public float jumpHeight = 2f;
    
    // Start is called before the first frame update
    void Start()
    {
        
    }
​
    // Update is called once per frame
    void Update()
    {
        //物理檢測,是否在地面上
        isGrounded = Physics.CheckSphere(groundCheck.position, groundDistance, groundMask);
        
        if(isGrounded && velocity.y < 0)
        {
            velocity.y = -2f;//正好在地面上,可以為0f,但-2f更好一些
        }
        
        //跳躍  這里默認空格鍵是跳躍按鍵
        if (Input.GetButtonDown("Jump") && isGrounded)
        {
            velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);
        }
        
        //這里在unity中默認“W”為向前,“D”向右,即通過控制x軸方向來控制物體在水平方向的運動;控制z軸,來控制物體前后移動
        float x = Input.GetAxis("Horizontal");
        float z = Input.GetAxis("Vertical");
​
        Vector3 move = transform.right * x + transform.forward * z;
        
        //將控制的方向與速度相乘,就能實現物體的運動,同樣,這里的Time.deltaTime也是解決幀率問題
        controller.Move(move * walkSpeed * Time.deltaTime);
        
        //三維向量組中的y   y=1/2*g*t*t
        //重力在每一幀的變化
        velocity.y += gravity * Time.deltaTime;
​
        controller.Move(velocity * Time.deltaTime);
        
        //當同時按下鍵盤上的“W”和“Q”鍵,進入跑步
        if(Input.GetKey(KeyCode.W)&& Input.GetKey(KeyCode.Q))
        {
            controller.Move(move * runSpeed * Time.deltaTime);
        }
        
    }
}

保存文件。

  1. 添加一個新的GameObject,重命名為GroundCheck;並調整其位置於物體最下方。

  2. 為Player添加Player Movement組件,如圖將各個變量加入進去

注意:如果沒有Ground這個選項,可以在最上方的Layers中新建一個,並將點擊場景修改圖層為Ground。

到此,基本功能就可以實現。

本文為博主自己根據b站上的視頻學習總結,如有疑問,可以參考b站原視頻:

https://www.bilibili.com/video/BV1nE411b7X8?t=1407

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM