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

Unity中跳跃功能异常求助:角色随机跳得更高

Unity跳跃高度随机异常的解决方法

问题根源

你当前代码里用了Input.GetKey(jumpKey),这个API在按住按键的每帧都会返回true。如果jumpCooldown时长较短,或者角色落地瞬间readyToJump刚好重置完成,按住空格的情况下会重复触发跳跃逻辑,叠加跳跃力,导致角色跳得比预期高。另外如果isGrounded的落地检测逻辑不严谨,也可能出现误触发的情况。

修复方案

1. 替换输入检测API

把Input.GetKey改成Input.GetKeyDown,这个API只在按键按下的第一帧返回true,从根源避免重复触发跳跃:

private void Jump()
{
    // 仅在按键按下的第一帧触发跳跃
    if (Input.GetKeyDown(jumpKey) && readyToJump && isGrounded)
    {
        readyToJump = false;
        isGrounded = false; // 主动标记为未落地,避免落地前误判

        // 重置Y轴速度,防止下落时的速度影响跳跃高度
        rb.velocity = new Vector3(rb.velocity.x, 0f, rb.velocity.z);
        // 添加跳跃力
        rb.AddForce(transform.up * jumpForce, ForceMode.Impulse);

        Invoke(nameof(ResetJump), jumpCooldown);
    }
}

private void ResetJump()
{
    readyToJump = true;
}

2. 优化落地检测逻辑

确保isGrounded只有在角色确实接触地面时才为true,比如用短射线从角色底部向下检测:

[SerializeField] private float groundCheckDistance = 0.1f;
[SerializeField] private LayerMask groundLayer;

private void Update()
{
    // 从角色Collider底部发射射线检测地面
    isGrounded = Physics.Raycast(transform.position, Vector3.down, groundCheckDistance, groundLayer);
    Jump();
}

(注意要给地面设置对应的Layer,并且确保角色的Collider和地面的Collider都正确设置)

3. 调整冷却时间

确保jumpCooldown的时长足够覆盖跳跃的空中阶段,避免在角色落地前就重置readyToJump。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:52:15