首页/ 第 10 章 · UI 界面系统/ 第 162 课
LESSON 162 · UI 界面系统

暂停菜单与游戏暂停

暂停系统已实现。下一课做游戏结束画面。

⏱ 约 14 分钟📊 难度:入门🗂 第 10 章 · UI 界面系统📍 第 162 / 300 课
课程进度
162 / 300

🎯本节学习目标

  • 掌握时间暂停
  • 实现暂停菜单
  • 实现恢复逻辑

🚀课程导读

“按 Esc 暂停、弹出菜单、再按恢复”——游戏标配。本课实现暂停系统。

Time.timeScale 暂停

暂停“整个世界的时间”。

  1. 【原理】Time.timeScale = 0 时,游戏时间停止:Update 仍调用但 Time.deltaTime=0,物理停止,动画暂停。
  2. 【暂停】Time.timeScale = 0f;
  3. 【恢复】Time.timeScale = 1f;
  4. 【注意】Time.unscaledDeltaTime 不受暂停影响(做“暂停时也能动的 UI 动画”用)。
  5. 【Awake/Start 不受影响】协程用 WaitForSeconds 会暂停(受 timescale 影响),用 WaitForSecondsRealtime 不受影响。
  6. 【鼠标】暂停时解锁光标(Cursor.lockState=None)让玩家能点菜单。
  7. 【恢复】点“继续”时:Time.timeScale=1 + 锁回光标。
  8. 【防冲突】恢复时确认之前是暂停状态,避免重复设。
  9. 【重要】暂停不等于停止 Update:Update 里的非时间逻辑仍执行,注意用 if(Time.timeScale>0) 或 isPaused 控制。
💡
timeScale=0 = 世界停摆;UI 动画要用 unscaled 时间才“照常动”。

实现暂停菜单

完整流程。

  1. 创建暂停面板:Canvas 下的 Panel(遮罩)+ 3 按钮(继续/设置/退出主菜单)。
  2. 默认把面板 SetActive(false)。
  3. 创建 PauseManager:
  4. public GameObject pausePanel;
  5. private bool isPaused = false;
  6. void Update() {
  7. if (Input.GetKeyDown(KeyCode.Escape)) { TogglePause(); }
  8. }
  9. public void TogglePause() {
  10. isPaused = !isPaused;
  11. Time.timeScale = isPaused ? 0f : 1f;
  12. pausePanel.SetActive(isPaused);
  13. Cursor.lockState = isPaused ? CursorLockMode.None : CursorLockMode.Locked;
  14. }
  15. public void Resume() { if (isPaused) TogglePause(); }
  16. public void QuitToMenu() { Time.timeScale = 1f; SceneManager.LoadScene("MainMenu"); }
  17. 【按钮绑定】继续→Resume;退出主菜单→QuitToMenu。
  18. 【注意】退出主菜单前恢复 timeScale=1,否则下个场景也是暂停的!
  19. 【半透明遮罩】Panel 用半透明黑,视觉上“暗下来”。
  20. 【测试】Esc 暂停/恢复、退出回主菜单。
切场景或退出前一定记得 Time.timeScale = 1,否则新场景“卡死”是新手高频坑。

常见错误与排查

错误:暂停后 UI 按钮也不动了?
原因:按钮动画用了受 timescale 影响的动画
解决:暂停菜单的动画用 unscaled 时间或不受 timescale 影响。

动手练习

课后小任务(做出来才算真的学会)

  • 实现 Esc 暂停/恢复
  • 做暂停菜单(继续/退出)
  • 退出前正确恢复 timeScale

本节小结

暂停系统已实现。下一课做游戏结束画面。

完成打卡后,主站会实时更新你的学习进度 🎯

← 上一课开始菜单制作