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

