使用直接挂到要控制的物体上就行
using UnityEngine;
[RequireComponent(typeof(CharacterController))]
public class FirstPersonController : MonoBehaviour
{
[Header("移动设置")]
[Tooltip("移动速度")]
public float movementSpeed = 5.0f;
[Tooltip("跳跃速度")]
public float jumpSpeed = 8.0f;
[Tooltip("重力(正数值)")]
public float gravity = 20.0f;
[Header("键盘旋转设置")]
[Tooltip("左右旋转的速度(角度/秒),用于 Q/E 键")]
public float rotationSpeed = 100.0f;
[Header("鼠标旋转设置")]
[Tooltip("鼠标灵敏度,用于按住右键时跟随鼠标左右旋转")]
public float mouseSensitivity = 3.0f;
// 内部变量:保存当前的运动方向
private Vector3 moveDirection = Vector3.zero;
private CharacterController characterController;
void Start()
{
characterController = GetComponent<CharacterController>();
}
void Update()
{
// 处理移动与跳跃
if (characterController.isGrounded)
{
// 获取 WASD 或箭头键输入
float horizontalInput = Input.GetAxis("Horizontal");
float verticalInput = Input.GetAxis("Vertical");
// 构造局部方向:前后左右
Vector3 forward = transform.forward;
Vector3 right = transform.right;
moveDirection = (forward * verticalInput + right * horizontalInput).normalized * movementSpeed;
// 跳跃(默认使用空格键)
if (Input.GetButton("Jump"))
{
moveDirection.y = jumpSpeed;
}
}
moveDirection.y -= gravity * Time.deltaTime;
// 使用 CharacterController.Move() 移动角色(确保帧率独立性)
characterController.Move(moveDirection * Time.deltaTime);
// 键盘旋转:Q/E 键
if (Input.GetKey(KeyCode.Q))
{
transform.Rotate(Vector3.up, -rotationSpeed * Time.deltaTime);
}
if (Input.GetKey(KeyCode.E))
{
transform.Rotate(Vector3.up, rotationSpeed * Time.deltaTime);
}
// 鼠标旋转:按住鼠标右键,跟随鼠标左右移动旋转
if (Input.GetMouseButton(1))
{
// Input.GetAxis("Mouse X") 获取鼠标水平移动量
float mouseDeltaX = Input.GetAxis("Mouse X");
transform.Rotate(Vector3.up, mouseDeltaX * mouseSensitivity);
}
}
}