如何在无限跑酷游戏中用CharacterController实现玩家左右移动与跳跃
无限跑酷游戏玩家移动(左右+跳跃)实现方案
原脚本未处理左右输入,且重力、跳跃逻辑不够严谨,以下是基于CharacterController的正确实现,可解决你提到的各类问题:
using UnityEngine; public class PlayerMove : MonoBehaviour { [Header("移动参数")] public float forwardSpeed = 8f; // 跑酷前进速度 public float horizontalSpeed = 5f; // 左右移动速度 public float jumpHeight = 2f; // 跳跃高度 public float gravity = 9.81f; // 接近真实物理的重力值 private CharacterController _controller; private Vector3 _moveDirection; private float _yVelocity; private void Awake() { _controller = GetComponent<CharacterController>(); } private void Update() { HandleMovement(); HandleJumpAndGravity(); // 应用移动 _controller.Move(_moveDirection * Time.deltaTime); } private void HandleMovement() { // 获取左右输入(支持A/D键或左右箭头) float horizontalInput = Input.GetAxis("Horizontal"); // 固定Z轴前进,X轴处理左右移动 _moveDirection = new Vector3(horizontalInput * horizontalSpeed, 0, forwardSpeed); // 保证移动方向与玩家朝向一致,适配场景旋转 _moveDirection = transform.TransformDirection(_moveDirection); } private void HandleJumpAndGravity() { if (_controller.isGrounded) { // 落地时重置垂直速度,避免异常下落 _yVelocity = -0.5f; // 触发跳跃 if (Input.GetKeyDown(KeyCode.Space)) { // 用物理公式计算初始跳跃速度,保证手感稳定:v = sqrt(2 * g * h) _yVelocity = Mathf.Sqrt(jumpHeight * 2 * gravity); } } else { // 空中持续叠加重力,保证自然下落 _yVelocity -= gravity * Time.deltaTime; } _moveDirection.y = _yVelocity; } }
关键优化说明
- 左右移动:通过
Input.GetAxis("Horizontal")获取标准化输入,适配多种设备,同时控制移动速度避免失控 - 跳跃逻辑:用物理公式计算初始跳跃速度,替代硬编码数值,保证跳跃手感一致;落地时重置垂直速度防止异常
- 重力处理:空中持续叠加重力,且基于
Time.deltaTime保证帧率无关的自然下落 - 方向适配:通过
TransformDirection确保移动方向与玩家朝向一致,适配场景旋转需求
使用注意事项
- 确保玩家对象已添加
CharacterController组件 - 可在Inspector面板调整参数(如
forwardSpeed、horizontalSpeed)适配游戏手感 - 若需限制玩家跑出赛道,可在
HandleMovement中添加X轴边界判断
内容的提问来源于stack exchange,提问作者Code Wire
相关产品推荐
相关产品推荐

