U
Unity
星辰学院
首页
课程表
章节导览
第 1 课
返回主站
首页
/
第 10 章 · UI 界面系统
/
第 162 课
LESSON 162 · UI 界面系统
暂停菜单与游戏暂停
暂停系统已实现。下一课做游戏结束画面。
⏱ 约 14 分钟
📊 难度:
入门
🗂 第 10 章 · UI 界面系统
📍 第 162 / 300 课
课程进度
162 / 300
🎯
本节学习目标
掌握时间暂停
实现暂停菜单
实现恢复逻辑
🚀
课程导读
“按 Esc 暂停、弹出菜单、再按恢复”——游戏标配。本课实现暂停系统。
◆
Time.timeScale 暂停
暂停“整个世界的时间”。
【原理】Time.timeScale = 0 时,游戏时间停止:Update 仍调用但 Time.deltaTime=0,物理停止,动画暂停。
【暂停】Time.timeScale = 0f;
【恢复】Time.timeScale = 1f;
【注意】Time.unscaledDeltaTime 不受暂停影响(做“暂停时也能动的 UI 动画”用)。
【Awake/Start 不受影响】协程用 WaitForSeconds 会暂停(受 timescale 影响),用 WaitForSecondsRealtime 不受影响。
【鼠标】暂停时解锁光标(Cursor.lockState=None)让玩家能点菜单。
【恢复】点“继续”时:Time.timeScale=1 + 锁回光标。
【防冲突】恢复时确认之前是暂停状态,避免重复设。
【重要】暂停不等于停止 Update:Update 里的非时间逻辑仍执行,注意用 if(Time.timeScale>0) 或 isPaused 控制。
💡
timeScale=0 = 世界停摆;UI 动画要用 unscaled 时间才“照常动”。
◆
实现暂停菜单
完整流程。
创建暂停面板:Canvas 下的 Panel(遮罩)+ 3 按钮(继续/设置/退出主菜单)。
默认把面板 SetActive(false)。
创建 PauseManager:
public GameObject pausePanel;
private bool isPaused = false;
void Update() {
if (Input.GetKeyDown(KeyCode.Escape)) { TogglePause(); }
}
public void TogglePause() {
isPaused = !isPaused;
Time.timeScale = isPaused ? 0f : 1f;
pausePanel.SetActive(isPaused);
Cursor.lockState = isPaused ? CursorLockMode.None : CursorLockMode.Locked;
}
public void Resume() { if (isPaused) TogglePause(); }
public void QuitToMenu() { Time.timeScale = 1f; SceneManager.LoadScene("MainMenu"); }
【按钮绑定】继续→Resume;退出主菜单→QuitToMenu。
【注意】退出主菜单前恢复 timeScale=1,否则下个场景也是暂停的!
【半透明遮罩】Panel 用半透明黑,视觉上“暗下来”。
【测试】Esc 暂停/恢复、退出回主菜单。
⛔
切场景或退出前一定记得 Time.timeScale = 1,否则新场景“卡死”是新手高频坑。
⚠
常见错误与排查
⛔
错误:
暂停后 UI 按钮也不动了?
原因:
按钮动画用了受 timescale 影响的动画
解决:
暂停菜单的动画用 unscaled 时间或不受 timescale 影响。
★
动手练习
课后小任务(做出来才算真的学会)
实现 Esc 暂停/恢复
做暂停菜单(继续/退出)
退出前正确恢复 timeScale
✓
本节小结
暂停系统已实现。下一课做游戏结束画面。
标记为已完成
完成打卡后,主站会实时更新你的学习进度 🎯
← 上一课
开始菜单制作
下一课 →
游戏结束画面(胜负界面)
↑