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

Unity新输入系统:手柄摇杆调用InputValue.isPressed报错及跳跃触发问题

解决Unity手柄摇杆绑定跳跃动作的触发问题

错误原因解析

第一次代码报错,是因为Jump动作绑定的是摇杆(Vector2类型控件),但InputValue.isPressed默认会尝试读取float类型的输入值,类型不匹配直接抛出InvalidOperationException。

第二次的代码能运行,但问题出在:每帧检测到摇杆上推(y值大于Mathf.Epsilon)就会执行velocity +=,导致摇杆上推期间持续叠加跳跃力,最终力度受摇杆上推时长/速度影响,没法实现固定力度的单次跳跃。

实现单次固定力度跳跃的方案

核心思路是检测摇杆上推的「上升沿」——也就是从非上推状态切换到上推状态的瞬间,只在这个时机触发一次跳跃逻辑。

方案1:修改输入动作配置(更简洁)

直接在Unity Input System里配置动作的触发规则,不需要改太多代码:

  • 打开你的Input Actions配置文件,找到Jump动作
  • 在动作的Interaction设置中,添加Press交互,勾选Trigger Once,并把Press Point设为0.5(摇杆上推超过一半时触发,避免轻微误触)
  • 配置完成后,动作只会在摇杆首次推到阈值时触发一次,代码可以简化为:
void OnJump(InputValue value)
{
    if (!capsuleCollider.IsTouchingLayers(LayerMask.GetMask("Ground")))
    {
        return;
    }
    // 用=替代+=,直接覆盖y轴速度,保证每次跳跃力度固定
    playerRb.velocity = new Vector2(playerRb.velocity.x, jumpForce);
}

方案2:代码手动检测上升沿(无需修改输入配置)

如果不想调整输入配置,可以在代码里维护一个状态变量,记录上一帧的摇杆状态,只在状态变化时触发跳跃:

private bool _wasJoystickUpLastFrame = false;

void OnJump(InputValue value)
{
    Vector2 inputValue = value.Get<Vector2>();
    // 用0.5作为触发阈值,比Mathf.Epsilon更不容易误触
    bool isJoystickUp = inputValue.y > 0.5f;

    if (!capsuleCollider.IsTouchingLayers(LayerMask.GetMask("Ground")))
    {
        _wasJoystickUpLastFrame = isJoystickUp;
        return;
    }

    // 仅在摇杆从非上推变为上推的瞬间触发跳跃
    if (isJoystickUp && !_wasJoystickUpLastFrame)
    {
        playerRb.velocity = new Vector2(playerRb.velocity.x, jumpForce);
    }

    _wasJoystickUpLastFrame = isJoystickUp;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 23:55:37