iT邦幫忙

2026 iThome 鐵人賽

DAY 19
0
Vibe Coding

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

【DAY19】Unity 2D 敘事遊戲開發:架構大躍進——跨場景常駐與 PersistentCanvas 的建立

  • 分享至 

  • xImage
  •  

一、前言:
在前幾天,我們依序完成了底層的 SavePointManager、動態存檔清單生成,以及流暢的 Toggle 開關與生命週期防呆。但一些遊戲開發的基礎功能往往最怕「換場景失效」!當玩家進入遊戲關卡後,如果想要隨時打開選單讀檔或調整設定,卻發現面板跟著標題場景一起消失,那就尷尬了。

所以今天【Day 19】我們要進行全系列最關鍵的架構升級:
1. DontDestroyOnLoad 跨場景常駐機制: 讓核心管理物件與 UI 跨越場景邊界,切換關卡也不會被銷毀。
2. 標準 Singleton 單例防呆: 確保跨場景載入時不會重複生成多個分身。
3. 全域 UI 總成配置: 將跨場景會用到的設定選單與動態面板納入常駐架構中。

二、核心程式實作:打造常駐管理器 (PersistentUI.cs)
我們在專案中建立 PersistentUI.cs,並掛載到負責常駐的根物件上。採用最標準且安全的單例防呆架構:

using UnityEngine;
public class PersistentUI : MonoBehaviour {
    // 確保靜態實例存在
    public static PersistentUI Instance; 
    void Awake()  {
        // 經典且安全的單例防呆
        if (Instance == null) {
            Instance = this;
            DontDestroyOnLoad(gameObject);
            Debug.Log("===> " + gameObject.name + " 已成功標記為【持久化】! <===");
        }
        else {
            // 如果已經存在舊的 Instance,就把這個剛才新冒出來的分身銷毀
            Debug.LogWarning(gameObject.name + " 偵測到重複,已銷毀重複實例。");
            Destroy(gameObject);
        }
    }
}

三、Unity 編輯器配置步驟(Hierarchy 總成示範):
1. 建立常駐根節點: 在標題場景(Title Scene)的根目錄建立一個空物件,命名為 PersistentManagers(或 PersistentUI),並將腳本掛載上去。
2. 配置子物件與 UI 總成:
將我們的 Canvas(內含 Setting、SettingPanel 與 SaveSelectPanel 等功能按鈕)拖曳成為常駐根節點的子物件。
https://ithelp.ithome.com.tw/upload/images/20260924/201840732rPnR0xAfS.png
圖一、架構示意圖

https://ithelp.ithome.com.tw/upload/images/20260924/20184073uFcdrBXsXJ.png
圖二、Setting與其功能已可常駐在後續幕數(以第三幕為例)

四、架構避坑與實戰小撇步:

  • 關於 EventSystem 的配置小提醒: 記得連同 Unity 內建的 EventSystem 一起放進常駐容器底下。這能確保切換場景時滑鼠點擊與輸入模組不會遺失,免去「換場景後按鈕突然按了沒反應」的常見靈異現象。
  • 避免使用 FindObjectsOfType 做初始化搜尋: 在 Awake 階段直接利用全域 Instance 進行防呆判定,效能更好且能避免新舊場景載入時的競態條件(Race Condition)。
  • UI 縮放模式(Canvas Scaler)設定: 因為這個 Canvas 會跨越所有不同解析度的遊戲場景,記得將其設定為 Scale With Screen Size,確保在任何裝置切換時版型都不會崩壞。

五、今日成果與小結

  • 成功導入 DontDestroyOnLoad 與標準 Singleton 防呆,讓 2D 敘事遊戲的 UI 互動與管理器具備完美的跨場景常駐能力。
  • 完善了全域 UI 總成的階層配置,徹底擺脫場景切換的束縛。

DAY19的內容獨立出來開一個全新的分支 feature/persistent-managers

1.檢查目前修改狀態
git status

2.建立並切換至新的獨立分支:
git checkout -b feature/persistent-managers

3.將今天的程式碼與修改加入暫存區並提交 Commit:
git add .
git commit -m "feat: 實作 PersistentUI 跨場景常駐管理器,結合 DontDestroyOnLoad 與 Singleton 確保 UI 總成不滅"

4.將新分支推送到遠端倉庫:
git push origin feature/persistent-managers


上一篇
【DAY18】Unity 2D 敘事遊戲開發:互動細節優化——面板 Toggle 開關、狀態同步與生命週期陷阱
下一篇
【DAY20】Unity 2D 敘事遊戲開發:系統選單總成——Pause Menu 與跨場景常駐按鈕(PersistentMenuController)
系列文
從課堂半成品到完整發布:獨立遊戲的30天重生記 共 24 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言