Unity输入系统:如何按一次空格键实现游戏暂停功能?
问题解决:单次按键切换游戏暂停/继续状态
核心问题分析
当前代码逻辑本身是正确的,但问题出在Input System的触发配置和时间缩放后的输入处理机制上:
- 若
pause动作的触发类型设置为「持续触发」,按住空格键时会反复调用切换逻辑,导致视觉上必须按住才能保持暂停; - 当
Time.timeScale=0时,Input System默认的动态更新模式会停止工作,无法接收按键事件来恢复游戏。
解决步骤
1. 修正Input Action触发模式
打开你创建的PauseActionInput对应的.inputactions资源文件:
- 找到
pause动作,将其Trigger Type设置为Pressed(仅在按键按下的瞬间触发一次performed事件,而非按住期间持续触发); - 确认动作绑定的是空格键的
Press事件,而非Hold事件。
2. 调整Input System更新模式
当Time.timeScale=0时,默认的动态更新会停止,导致输入事件无法被处理,需要修改全局设置:
- 打开
Edit > Project Settings > Input System Package > Input System Settings; - 将Update Mode设置为
Process Events In Update或Process Events In Fixed Update(这两种模式不受Time.timeScale影响,即使时间缩放为0也能正常处理输入)。
3. 代码优化(可选)
原代码逻辑没问题,可做小优化提升健壮性:
using UnityEngine; using UnityEngine.UI; public class PauseManager : MonoBehaviour { public float timeLeft = 0; public bool timeOn = false; public Text timeText; private bool _isPaused = false; // 替换静态变量为实例变量,避免全局污染 public PauseActionInput _pauseAction; public AudioSource audiosource1; public GameObject pausemenu; public static PauseManager Instance; // 单例模式,方便其他脚本调用 private void Awake() { _pauseAction = new PauseActionInput(); Instance = this; } private void Start() { _pauseAction.PauseActionMap.pause.performed += _ => TogglePause(); } private void OnEnable() { _pauseAction.Enable(); } private void OnDisable() { _pauseAction.Disable(); } private void TogglePause() // 函数名更直观 { if (_isPaused) ResumeGame(); else PauseGame(); } public void ResumeGame() { Time.timeScale = 1; AudioListener.pause = false; pausemenu.SetActive(false); _isPaused = false; Debug.Log("游戏已继续"); } public void PauseGame() { Time.timeScale = 0; AudioListener.pause = true; pausemenu.SetActive(true); _isPaused = true; Debug.Log("游戏已暂停"); } }
内容的提问来源于stack exchange,提问作者tobyteng
相关产品推荐
相关产品推荐

