Unity3D如何实现角色移动?3D FPS游戏键鼠移动功能开发问询
Unity 3D FPS 基础移动与视角控制实现方案
前期准备
- 给角色对象添加 CharacterController 组件(比原生刚体更适配FPS移动逻辑,可避免不必要的物理碰撞卡顿问题)
- 在角色对象下挂载相机作为子物体,调整相机初始位置对齐角色头部高度
- 确认Unity输入管理器中默认的
Horizontal/Vertical/Mouse X/Mouse Y轴配置未被修改
1. 键盘控制角色移动实现
核心逻辑为读取键盘方向输入,将输入值转换为跟随当前角色朝向的世界空间移动向量,调用组件接口执行移动:
- 核心可调参数:
moveSpeed移动速度,初始推荐设置为5f - 所有位移计算需乘以
Time.deltaTime,保证不同帧率下移动速度一致 - 移动方向要基于角色当前的
transform.right(左右方向)和transform.forward(前后方向)计算,保证移动方向和视角朝向匹配
2. 鼠标控制视角移动实现
核心逻辑为读取鼠标XY轴偏移量,X轴偏移控制角色整体左右旋转,Y轴偏移控制相机上下俯仰,同时限制俯仰角度避免视角翻转:
- 核心可调参数:
mouseSensitivity鼠标灵敏度,初始推荐设置为100f;maxLookAngle最大俯仰角度,推荐设置为90f - 鼠标输入值需乘以
Time.deltaTime和灵敏度参数做适配 - 上下俯仰角度使用
Mathf.Clamp()限制在-maxLookAngle到maxLookAngle区间,防止视角转过后仰出现颠倒
完整可运行脚本示例
将以下脚本挂载到角色根对象上,把角色下的相机拖到脚本的playerCam字段即可直接使用:
using UnityEngine; [RequireComponent(typeof(CharacterController))] public class FPSController : MonoBehaviour { [Header("移动参数")] public float moveSpeed = 5f; [Header("视角参数")] public Camera playerCam; public float mouseSensitivity = 100f; public float maxLookAngle = 90f; private CharacterController _controller; private float _xRotation = 0f; void Start() { _controller = GetComponent<CharacterController>(); // 启动时锁定鼠标到游戏窗口中心 Cursor.lockState = CursorLockMode.Locked; } void Update() { // 处理视角转动逻辑 float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime; float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime; _xRotation -= mouseY; _xRotation = Mathf.Clamp(_xRotation, -maxLookAngle, maxLookAngle); playerCam.transform.localRotation = Quaternion.Euler(_xRotation, 0f, 0f); transform.Rotate(Vector3.up * mouseX); // 处理移动逻辑 float horizontalInput = Input.GetAxis("Horizontal"); float verticalInput = Input.GetAxis("Vertical"); Vector3 moveDir = transform.right * horizontalInput + transform.forward * verticalInput; _controller.Move(moveDir.normalized * moveSpeed * Time.deltaTime); } }
测试时如果鼠标未锁定无法转动视角,点击一次游戏窗口即可自动锁定,按ESC键可解锁鼠标
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

