iT邦幫忙

2026 iThome 鐵人賽

DAY 21
0
Vibe Coding

從課堂半成品到完整發布:獨立遊戲的30天重生記系列 第 21 篇

【DAY21】Unity 2D 敘事遊戲開發:主選單返回機制與時間軸防呆重設(GoToMainMenu)

  • 分享至 

  • xImage
  •  

一、前言:
當玩家在遊戲中途有事不得不放棄進度時,一定要能安全地返回主選單(Main Menu)並退出遊戲。下一次開啟遊戲時用【DAY17】所創的存檔點接續進行進度。今天我們要專注實作返回主選單的核心機制,特別是處理切換場景時最容易踩坑的「時間軸凍結殘留與全域旗標重設」!

二、 返回主選單的需求與防呆挑戰
當玩家點擊「返回主選單」按鈕時,程式必須依序處理以下幾個關鍵步驟:

  • 解除時間軸凍結 (Time.timeScale = 1f): 因為遊戲在暫停時通常會把 Time.timeScale 設為 0f,若直接切換場景而不恢復,下一個場景會當場卡死。
  • 重設全域狀態旗標 (IsGamePaused = false): 清除暫停狀態,避免新場景誤判以為遊戲還處於暫停中。
  • 場景安全載入 (SceneManager.LoadScene): 順利將畫面切回標題場景。

三、 核心程式實作:PauseMenuController 中的返回邏輯
我們直接延續昨日實作的 PauseMenuController.cs 基礎架構。在昨天的暫停與恢復邏輯之上,今天我們要在同一個檔案中新增一個關鍵功能——讓玩家在遊戲中途可以安全地返回主選單,同時加上時間軸與全域旗標的防呆重設:

public class PauseMenuController : MonoBehaviour {
    // ... 前面 DAY20 實作的暫停與恢復邏輯省略 ...

    // DAY21 新增:返回主選單與時間軸防呆核心
    public void GoToMainMenu() {
        Time.timeScale = 1f; // 離開前務必恢復時間軸,防止下個場景卡死!
        IsGamePaused = false; // 重設暫停旗標
        SceneManager.LoadScene("SampleScene"); // 載入主選單場景
    }
}

關鍵程式碼解析:

  • Time.timeScale = 1f;: 在離開場景的第一行強制將遊戲時間恢復正常。如果漏掉這行,主選單的按鈕跟動畫會因為時間被凍結在 0f 而全部卡死。
  • IsGamePaused = false;: 重設全域靜態旗標,確保返回主畫面後,系統不會誤判遊戲仍處於暫停狀態。
  • SceneManager.LoadScene("SampleScene");: 執行 Unity 的場景管理器,安全載入指定的標題選單場景。

四、 Unity Inspector 設定與實測驗收
1. 腳本掛載: 確保 PauseMenuController 已經掛載在遊戲中的常駐或管理物件上。
2. 按鈕事件串接:

  • 創造並選中畫面上的「返回主選單」按鈕(例如 QuitToMenuButton)。
  • 在 Inspector 視窗的 Button (Script) 區塊中,找到 On Click () 清單並點擊 + 新增一個事件。
  • 將掛載了 PauseMenuController 的物件拖曳至左側的物件欄位。
  • 點擊右側的下拉選單,選擇 PauseMenuController -> GoToMainMenu()
  • 同昨日所創之PauseButton掛載於InGameButtons下(在劇情中才顯示)
    https://ithelp.ithome.com.tw/upload/images/20260928/201840736Tuq6TsVoI.png
    圖一、串接示意圖

https://ithelp.ithome.com.tw/upload/images/20260928/201840737XrmepuW3V.png
圖二、UI成果示意圖

3. 跨場景返回實測: 在遊戲中實際執行時,點擊暫停選單中的返回按鈕,時間軸會成功被重設為 1f,畫面流暢切回主選單場景,且完全沒有發生卡死或背景對話殘留的現象。

五、 開發實戰經驗:避開專案打包後的經典雷點

  • 時間軸重設永遠放第一行: 在任何涉及離開關卡、返回主選單或切換至結算畫面的函式中,第一行一定要寫上 Time.timeScale = 1f;。這是獨立開發者最常忘記、也最容易導致專案打包發布後出現詭異卡死 Bug 的元兇。
  • 善用 static 旗標全域同步: 將 IsGamePaused 設為靜態變數,能讓其他腳本或系統隨時掌握遊戲是否處於暫停狀態,在切回主選單時也能夠乾淨地一併歸零,維護良好的狀態機生命週期。

六、 今日成果與小結

  • 返回主選單總成: 成功實裝點擊後一鍵切回標題場景的導向機制,並完美對接 UI 按鈕事件。
  • 防呆機制完善: 徹底解決了時間軸殘留與暫停旗標未清除所導致的場景卡死問題,讓玩家能隨時安心退回主選單,並在下次透過存檔點無縫接續遊玩!

範例影片:Yes

今天的內容主要是實作「返回主選單的核心機制」,並透過處理 Time.timeScale = 1f 與 IsGamePaused = false 來防止場景切換卡死,這與前幾天的暫停選單(PauseMenuController)和跨場景常駐管理(PersistentManagers)是緊密相連的,因此是屬於同個分支--feature/persistent-managers。

1.檢查修改狀態
git status

2.加入暫存區並提交 Commit
git add .
git commit -m "feat: 實作 GoToMainMenu 返回主選單機制,並加入時間軸防呆與靜態旗標重設以防範場景卡死"

3.推送到遠端分支
git push origin feature/persistent-managers


上一篇
【DAY20】Unity 2D 敘事遊戲開發:系統選單總成——Pause Menu 與跨場景常駐按鈕(PersistentMenuController)
下一篇
【DAY22】Unity 2D 敘事遊戲開發:Bad End 條件判定與決策流攔截機制(GameConditionManager )
系列文
從課堂半成品到完整發布:獨立遊戲的30天重生記 共 24 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言