Unity角色移动脚本重力不生效、跳跃功能无法使用问题求助
重力与跳跃失效原因
1. Y轴速度被每帧强制重置(核心故障)
你当前代码每帧执行时,都会通过Vector3 moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"))直接把Y轴速度设为0,上一帧累积的重力下落速度、跳跃产生的向上速度会被完全清空。
重力的生效逻辑是逐帧累积Y轴向下的速度,你每帧重置Y轴为0后,仅在当前帧减去gravity * Time.deltaTime,最终传入controller.Move的Y轴位移为(-gravity * Time.deltaTime) * Time.deltaTime,每帧下落距离几乎可以忽略,就会出现悬浮效果。同时跳跃给的Y轴速度也会在次帧被重置,根本不会产生向上的位移。
2. 地面检测(isGrounded)失效
如果CharacterController组件参数设置错误,isGrounded会永远返回false,跳跃逻辑永远不会触发。
修复后的代码
using UnityEngine; public class SimpleMovement : MonoBehaviour { public float airSpeedCoefficient = 0.5f; public float speed = 6.0F; public float jumpSpeed = 8.0F; public float gravity = 20.0F; public CharacterController controller; void Awake() { controller = GetComponent<CharacterController>(); } void Update() { // 处理水平移动逻辑 Vector3 moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")); moveDirection = transform.TransformDirection(moveDirection); moveDirection *= speed; // 保留上一帧的Y轴速度,不做重置 moveDirection.y = controller.velocity.y; if (controller.isGrounded) { // 落地时给一个微小的向下速度,保证地面检测持续生效 moveDirection.y = -0.1f; // 跳跃检测改为GetButtonDown,避免按住跳跃键反复触发 if (Input.GetButtonDown("Jump")) moveDirection.y = jumpSpeed; } // 逐帧累积重力 moveDirection.y -= gravity * Time.deltaTime; // 执行移动 controller.Move(moveDirection * Time.deltaTime); } }
额外检查项
- 确认角色对象上挂载了
CharacterController组件,且组件的Height、Radius、Center参数和角色模型碰撞体积匹配 - 确认
CharacterController的Skin Width参数设置合理,建议为Height的1/10左右,参数过小会导致地面检测失效 - 确认地面对象挂载了非触发(Is Trigger 未勾选)的碰撞体组件
内容的提问来源于stack exchange,提问作者rovvan
相关产品推荐
相关产品推荐

