一、功能描述
在一個場景中實現人物的前后左右移動和跳躍功能;其中前后左右移動通過W、A、S、D方向鍵實現,跳躍功能通過空格鍵實現,並且考慮到重力作用,來調節跳躍功能。
2.1創建一個Character Controller
-
先創建一個新的GameObject,並重命名為Player
-
並為其添加一個Character Controller組件
-
在Player下,創建一個Cylinder物體(代替人物),並將場景中的主相機(Main Camera)放於Player下
將Cylinder物體中的Capsule Collider組件刪除,解決碰撞問題。
2.2實現相機(第一人稱視角的旋轉,左右)的移動
相機的視角通過鼠標mouse進行控制
-
Assets文件夾下創建Scripts文件夾,用來保存代碼文件;並在Scripts文件夾下創建CameraMove的C#文件並打開;
-
直接放代碼,相關解釋在代碼里:
//所有代碼如下: 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軸旋轉 } }
-
注意:攝像機和物體Cylinder的y軸差距不要很大,很大的話會出現問題,盡量重合。
-
保存文件,並將Camera Move文件作為組件添加給主攝像機,並把Player拖入到Player Body上,如圖:
-
運行並調試,攝像機可以根據鼠標運動而改變視野角度。
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); } } }
保存文件。
-
添加一個新的GameObject,重命名為GroundCheck;並調整其位置於物體最下方。
-
為Player添加Player Movement組件,如圖將各個變量加入進去
注意:如果沒有Ground這個選項,可以在最上方的Layers中新建一個,並將點擊場景修改圖層為Ground。
到此,基本功能就可以實現。
本文為博主自己根據b站上的視頻學習總結,如有疑問,可以參考b站原視頻:
https://www.bilibili.com/video/BV1nE411b7X8?t=1407