1.初始配置
- 安裝Cinemachine插件
- 給角色添加CharacterConroller
- 創建Cinemachine-->Free Look Camera
- 在Free Look Camera中調整參數,Y Axis勾選Inver,X Axis取消勾選Inver
- Free Look Camera要看向角色 + 跟隨角色(自行設置,我就不再贅述了)
2.編寫C#腳本
代碼可以自行收藏直接用,關鍵自行調整的參數是:
speed、rotateSpeed、jumpHeight
using UnityEngine;public class PlayerController : MonoBehaviour
{[Header("參數")] public float speed; //角色移動速度(跑步的時候是兩倍)public float rotateSpeed; //角色轉向速度public float playerGravity = 9.8F; //角色重力public float jumpForce; //跳躍力度public float jumpHeight = 2F; //跳躍高度public float verticalVelocity = 0;//垂直速度[Header("狀態")] public bool isMove; //是否在移動public bool isRun; //是否在跑步[Header("輸入")]public Vector3 inputDirection; //wasd輸入(x值表示horizontal,z值表示vertical,y值為0)[Header("組件")]public CharacterController characterController; //這個在Start函數中初始化,你也可以在Inspector初始化private void Start(){inputDirection = new Vector3();characterController = GetComponent<CharacterController>();}private void Update(){//計算WASD輸入inputDirection.x = Input.GetAxisRaw("Horizontal");inputDirection.z = Input.GetAxisRaw("Vertical");//獲得是否是移動和跑步狀態isMove = inputDirection.magnitude > 0;isRun = isMove && Input.GetKey(KeyCode.LeftShift);//光標的可見性設置if (Input.GetKeyDown(KeyCode.I)){Cursor.visible = !Cursor.visible;}if (Input.GetKeyDown(KeyCode.Space)){characterController.SimpleMove(transform.up * jumpForce);}if (!isMove) return;//實現角色轉向到相機平行于xz軸構成的平面的朝向Vector3 targetDirection = new Vector3(inputDirection.x, 0, inputDirection.z);float y = Camera.main.transform.rotation.eulerAngles.y;Quaternion targetRotation = Quaternion.Euler(0, y, 0) * Quaternion.LookRotation(targetDirection);// 使用Quaternion.Slerp進行平滑轉向transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * rotateSpeed);}private void FixedUpdate(){Vector3 moveDirection = Vector3.zero;moveDirection += transform.forward * inputDirection.z;moveDirection += transform.right * inputDirection.x;moveDirection *= Time.fixedDeltaTime * (isRun ? speed*2 : speed);// 重力if (!characterController.isGrounded)verticalVelocity -= playerGravity * Time.fixedDeltaTime;// a*t=velseverticalVelocity = 0.0F;// 跳躍if (Input.GetButton("Jump")){// 得在地面才能跳if (characterController.isGrounded){verticalVelocity = Mathf.Sqrt(jumpHeight * 2 / playerGravity) * playerGravity;// 初始向上速度}}moveDirection.y += verticalVelocity * Time.fixedDeltaTime;// v*t=s// 移動characterController.Move(moveDirection);}
}
3.測試效果
測試運行效果,看看是否正常