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

Unity新Input System实现GetButton及2D跳跃失效问题排查

问题根因

你的重力调整逻辑失效是两个实现错误导致的:

  • Unity新输入系统的OnJump(InputValue value)是输入事件回调,仅在Jump按键按下、松开的瞬间被系统自动触发,不会每帧执行。你在Update()里手动无参调用OnJump()时,传入的InputValue为空,状态读取完全错误。
  • 重力乘数修正逻辑需要每帧持续运行:只要角色处于下落/上升状态,就要持续叠加额外重力,不能只在输入事件触发的单帧执行一次。
修复方案

单独用布尔变量存储跳跃按键的实时按住状态,重力修正逻辑放回Update()中每帧执行,仅在输入回调里更新按键状态即可,修复后的完整代码如下:

public float fallMultiplier = 2.5f;
public float lowJumpMultiplier = 2f;
// 可根据你的项目配置补充跳跃力参数
// public float jumpForce = 7f;

private Rigidbody2D rb2D;
// 存储跳跃键按住状态
private bool isJumpHeld;

void Awake()
{
    rb2D = GetComponent<Rigidbody2D>();
}

void Update()
{
    // 每帧执行重力修正,逻辑和旧输入系统版本完全一致
    if (rb2D.velocity.y < 0)
    {
        rb2D.velocity += Vector2.up * Physics2D.gravity.y * (fallMultiplier - 1) * Time.deltaTime;
    }
    else if (rb2D.velocity.y > 0 && !isJumpHeld)
    {
        rb2D.velocity += Vector2.up * Physics2D.gravity.y * (lowJumpMultiplier - 1) * Time.deltaTime;
    }
}

// 输入系统自动回调,仅更新按键状态、处理跳跃触发逻辑
void OnJump(InputValue value)
{
    isJumpHeld = value.isPressed;
    // 按下跳跃键时触发起跳,替换为你自己的起跳逻辑即可
    if (isJumpHeld)
    {
        // 示例起跳逻辑:
        // rb2D.velocity = new Vector2(rb2D.velocity.x, jumpForce);
    }
}

注意:不要手动调用OnJump()方法,该方法由Unity输入系统在输入状态变化时自动调度,手动调用会导致状态读取异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:36:27