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
相关产品推荐
相关产品推荐

