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

Unity3D中Input.GetKeyDown工作异常 跳跃功能偶发不生效

问题原因

你的跳跃功能偶发失效是两个核心代码逻辑错误导致的:

  • 物理调用生命周期不匹配:Rigidbody的所有物理相关操作(包括AddForce)必须放在FixedUpdate方法中执行。Update是和渲染帧率绑定的,帧间隔不稳定,和Unity物理引擎的固定时间步更新节奏不同步;而Input.GetKeyDown仅在按键按下的单帧内返回true,如果检测到按键的那一帧Update执行时机和物理帧错开,你这次调用的AddForce会直接被物理引擎忽略,就会出现按多次键只有少数几次生效的情况。
  • 力的计算方式错误:你给跳跃力乘了Time.deltaTime,这个值在Update中是单帧的时长(通常在0.005~0.02之间浮动),乘完之后实际施加的力数值被压到了2以下,远达不到能让玩家跳起来的阈值;且默认的AddForce力模式本身就会按物理帧间隔做计算,不需要手动乘时间系数。

另外你当前的代码没有加落地检测,后续就算修复了触发问题,也会出现空中连跳、跳跃力叠加的异常。

修复步骤
  • 把输入检测和物理操作拆分:按键检测放在Update中保证输入不丢失,刚体操作全部移到FixedUpdate中和物理引擎节奏对齐。
  • 移除跳跃力上的Time.deltaTime乘法,跳跃场景使用ForceMode.Impulse(瞬间冲量模式),更符合跳跃瞬间发力的物理表现。
  • 补充基础落地检测,避免空中触发跳跃。
修复后完整参考代码
using UnityEngine;

public class PlayerJump : MonoBehaviour
{
    public float jumpForce = 8f;
    public Rigidbody rb;
    public Transform groundCheckPoint;
    public LayerMask groundLayer;
    private bool _jumpInput;

    void Update()
    {
        // 仅在Update中处理输入检测
        if (Input.GetKeyDown(KeyCode.Space))
        {
            _jumpInput = true;
        }
    }

    private void FixedUpdate()
    {
        // 所有物理逻辑放在FixedUpdate
        // 检测玩家是否接触地面
        bool isGrounded = Physics.CheckSphere(groundCheckPoint.position, 0.15f, groundLayer);
        
        if (_jumpInput && isGrounded)
        {
            // 施加瞬间向上冲量前重置y轴速度,避免下落状态下跳跃高度不足
            rb.velocity = new Vector3(rb.velocity.x, 0, rb.velocity.z);
            rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
            _jumpInput = false;
        }
    }
}
配置说明
  • 把玩家对象上的刚体组件直接拖到rb字段,不要在代码里动态查找,减少不必要的性能消耗。
  • 在玩家角色脚底位置创建一个空物体,拖到groundCheckPoint字段,作为落地检测的中心点。
  • 在groundLayer中指定你场景里地面所在的层,不要把玩家自身所在层加进去,避免检测误判。
  • 跳跃力数值可以根据你项目设置的重力Scale调整,常规3D项目8~15的数值区间就能满足普通跳跃需求,不需要设置到100那么大。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 13:06:24