You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity C#第一人称游戏角色跳跃功能偶发失效、跳不高问题求助

问题原因
  • isGrounded状态检测逻辑顺序错误。CharacterController的isGrounded标识只会在调用Move方法后更新当前帧的落地状态,原代码先判断isGrounded再执行Move,获取的永远是上一帧的旧状态,会出现已落地但判定为空中无法跳跃、或刚起跳就被判定为落地打断跳跃的情况,对应你遇到的无响应、小跳问题。
  • 落地时向下速度不足,触地检测不稳定。原代码落地时给垂直速度赋值为-gravity * Time.deltaTime,这个向下的力过小,CharacterController需要持续的稳定向下压力才能可靠判定触地,否则会出现偶发的落地检测失效,导致跳跃无响应。
  • 多脚本调用Move产生冲突。你将跳跃逻辑和其他移动逻辑拆分,若两个脚本都调用了controller.Move,两次位移计算会互相覆盖,同时打乱isGrounded的状态更新,直接导致跳跃行为异常。
修复方案

1. 调整跳跃脚本逻辑

修改后的完整代码如下:

using UnityEngine;

public class Jump : MonoBehaviour
{
    private CharacterController controller;

    private float verticalVelocity;
    private float gravity = 14f;
    private float jumpForce = 10f;
    // 固定落地向下压力,保证触地检测稳定
    private const float GroundDownForce = -2f;

    private void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    private void Update()
    {
        // 优先捕获跳跃输入,避免跨帧丢失
        bool hasJumpInput = Input.GetKeyDown(KeyCode.Space);
        
        if (controller.isGrounded)
        {
            verticalVelocity = GroundDownForce;
            if (hasJumpInput)
            {
                verticalVelocity = jumpForce;
            }
        }
        else
        {
            verticalVelocity -= gravity * Time.deltaTime;
        }

        Vector3 verticalMove = new Vector3(0, verticalVelocity, 0);
        controller.Move(verticalMove * Time.deltaTime);
    }
}

2. 解决多脚本移动冲突

所有和角色移动相关的逻辑必须合并为同一次controller.Move调用:你可以将跳跃脚本计算出的垂直速度,和其他移动脚本计算出的水平位移合并为同一个Vector3参数,统一在一个脚本中调用Move,禁止多脚本分别调用Move方法。

3. 可选参数优化

调整CharacterController组件参数进一步提升稳定性:

  • Skin Width设置为0.08左右,避免角色模型边缘碰撞检测失效
  • Step Offset设置为0.2~0.4(和角色步高匹配),避免爬坡时误判为空中

内容的提问来源于stack exchange,提问作者smonk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 06:24:02