如何使用InputActionPhase?Unity新输入系统暂停菜单无法关闭求助
Unity新输入系统暂停菜单无法关闭的修复方案
问题根源
- Time.timeScale=0导致输入事件丢失:游戏暂停时
Time.timeScale设为0,Unity新输入系统默认依赖缩放后的时间更新,按键抬起的Canceled阶段事件可能无法被正确捕获,进而无法触发Resume逻辑。 - UI输入映射未绑定暂停按键:暂停后切换到UI输入组,但如果UI组未绑定相同的暂停触发按键,即使按下按键也无法触发回调。
修复步骤
1. 修改输入回调的阶段判断
将Canceled阶段改为Performed阶段,Performed是按键按下完成时的事件,不受timeScale影响,更适合暂停/继续的切换逻辑:
private bool _onPaused = false; public void OnPause(InputAction.CallbackContext context) { if(context.phase == InputActionPhase.Performed) { if (!_onPaused) { Paused(); } else { Resume(); } } }
2. 为UI输入组绑定暂停按键
打开你的输入动作资源(.inputactions文件),在UI输入映射下添加与Player组相同的Pause动作,绑定同一个触发按键(比如Escape键)。确保暂停后UI输入启用时,能捕获到按键事件触发回调。
3. 调整Resume方法的执行顺序(可选)
先恢复时间缩放,再切换输入组,确保输入系统能正常更新:
private void Resume() { Time.timeScale = 1.0f; _playerInputActions.UI.Disable(); _playerInputActions.Player.Enable(); _menu.SetActive(false); _onPaused = false; }
4. 验证PlayerInput组件设置
检查场景中的PlayerInput组件:
- 确认
Action Maps包含Player和UI两组 - 确保
Behavior设置为Send Messages或Invoke Unity Events,保证能正确调用OnPause方法
内容的提问来源于stack exchange,提问作者Nikolay Stuff
相关产品推荐
相关产品推荐

