iT邦幫忙

2026 iThome 鐵人賽

DAY 6
0
Vibe Coding

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

【DAY6】Unity 2D 敘事遊戲開發:場景銜接與單向流轉機制 (SceneChanger)

  • 分享至 

  • xImage
  •  

一、前言:
在昨天完成音量設定持久化後,今天【DAY 06】我們要把視角轉向遊戲的 場景流轉與過場銜接!在開發文字冒險或劇情導向的遊戲時,許多新手常問:「是不是一定要寫一套很複雜的動態載入系統?」其實不然!為了確保劇情節奏與幕數(Act/Scene)轉換的精確度,「人工手動精細銜接場景」 反而是最穩定、最不易產生 Bug 的經典作法。今天這篇就來複習與分享我們專案中是如何透過最直覺的方式管理與切換這些幕數場景!
二、劇情遊戲的場景架構思維
由於我是故事的原創者,所以在其他組員畫完美術繪圖後,確認沒有其他問題我便投入參與Unity的監工與製作,確保每一幕的內容與我所預期的相符。在我們這個專案中,故事是由多個幕數環環相扣而成的。從 Project 面板中可以看到,我們將每個劇情關鍵節點獨立切分為單獨的 Scene:
為什麼採用「單向/節點式」場景銜接?

  1. 劇情順序控制極度精確: 即使同場景不同幕仍需分開寫,因為每一幕的觸發條件、背景音樂、對話資料都是獨一無二的,手動銜接能確保玩家不會跳幕或讀取錯亂。
  2. 記憶體管理乾淨: 切換場景時 Unity 會自動釋放上一個幕數的無用資源,避免文字與立繪資源越積越多。
  3. 除錯極度方便: 舉例-開發階段想測試第 18 幕,直接在 Hierarchy 開啟18幕 即可單獨測試,不用從頭播放劇情。

三、核心場景切換器:SceneChanger.cs
為了讓主選單按鈕或是選單裡的其他功能能順利切換到目標幕數,我們寫了一個簡單直覺的 SceneChanger 腳本來負責調度:

using UnityEngine;
using UnityEngine.SceneManagement;
public class SceneChanger : MonoBehaviour {
    // 可在 Inspector 設定場景名稱或直接在按鈕中指定
    [Header("設定要切換的場景名稱")]
    public string targetSceneName;

    // 如果想要用 Inspector 設定好場景名稱
    public void ChangeToTargetScene() {
        if (!string.IsNullOrEmpty(targetSceneName)) {
            SceneManager.LoadScene(targetSceneName);
            Debug.Log($"Switched to target scene: {targetSceneName}");
        }
        else {
            Debug.LogWarning("Target scene name is not set!");
        }
    }

    // 開始遊戲(直接指定載入第一幕)
    public void StartGame() {
        SceneManager.LoadScene("Firstscene 1幕"); 
        Debug.Log("Game Start!");
    }

    // 結束遊戲
    public void QuitGame() {
        Application.Quit();
        Debug.Log("Game Quit!");
    }
}

光寫好 C# 腳本還不夠,必須在 Unity 場景中建立實體物件來承載這個元件:

  1. 建立空物件: 在 Hierarchy 視窗空白處點擊右鍵 -> Create Empty,將物件名稱命名為 SceneChanger。
  2. 掛載 C# 腳本: 點擊該物件,將寫好的 SceneChanger.cs 腳本直接拖入 Inspector 視窗,或是點擊 Add Component 搜尋並加入。
  3. 設定 Inspector 參數: 可以在 Target Scene Name 欄位預先填入要切換的目標場景名稱。
    https://ithelp.ithome.com.tw/upload/images/20260911/20184073ilyFq9p6XM.png
    圖一、場景切換示意圖(以第六幕銜接第七幕為範例)

四、預先配置:Build Settings 與 UI 按鈕綁定
由於我們在開發前就已經全盤規劃好劇情,且每一幕的背景都已明確定案,因此在建置階段,我們就一次性將所有幕數的 Scene 通通預先拉入 Build Settings 清單中,確定好全劇情的流轉順序。

1. 預先將全幕數場景拉入 Build Settings
點選 Unity 頂部選單 File -> Build Settings,將 Scenes 資料夾裡所有已經定好的幕數場景(Firstscene 1幕、BlackScene 4幕、Consent form 等)一次性拖入 Scenes In Build 清單中。
https://ithelp.ithome.com.tw/upload/images/20260911/20184073ApF0p1777v.png
圖二、幕數訂定示意圖

💡Tips: 主選單(SampleScene)必須固定放在最上面的 Index 0 作為遊戲入口,其餘幕數場景則依照劇情順序或指定名稱進行管理。

2. UI 按鈕 (Button) 事件綁定
以Hierarchy 中的 StartGame 按鈕為例:

  1. 找到 Button 組件底下的 On Click () 區塊。
  2. 點擊 + 新增事件。
  3. 將接下來的幕數代入 SceneChanger的 Next Scene-第一幕 Firstscene 1幕。
  4. 將掛載了 SceneChanger 的物件拖入欄位。
  5. Function 選擇 SceneChanger -> StartGame()(自動切換至3.時已預定好的第一幕 Firstscene 1幕)。
    https://ithelp.ithome.com.tw/upload/images/20260911/20184073FSe04OALNu.png
    圖三、以遊戲主頁面須按START來切換第一幕

五、 開發實戰踩雷經驗分享
場景名稱大小寫/中文字符拼錯: 在 SceneManager.LoadScene("Firstscene 1幕") 中,字串必須與 Project 裡的 Scene 檔名 100% 完全一致(包含空格與繁體中文)。若拼錯,Unity 主控台會報出 Scene '--' couldn't be loaded because it has not been added to the build settings 的錯誤。
Application.Quit() 在 Editor 沒反應: 執行 QuitGame() 時,在 Unity Editor 點擊測試是不會關閉 Editor 的(只會在 Console 印出 Game Quit!),必須等最後打包出成 .exe 執行檔後才會真正關閉遊戲視窗。

六、 今日成果與小結

  • 觀念建立: 釐清劇情遊戲中「原創劇本與單向幕數銜接」的實作細節。
  • 流轉維護: 透過 SceneChanger 腳本與 Unity 原生 SceneManager 完成主選單 StartGame(指向 Firstscene 1幕)與 QuitGame 的流暢控制。

最後別忘了傳到GitHub做紀錄:

1.檢查修改狀態
git status

2.加入暫存區並提交 Commit
git add .
git commit -m "feat: 新增 SceneChanger 場景切換腳本與 Build Settings 幕數配置"

3.推送到遠端開發分支
git push origin feature/story-flow


上一篇
【DAY5】Unity 2D 像素風遊戲開發: AudioMixer 分貝轉化與音量設定持久化 (PlayerPrefs)】
下一篇
【DAY7】Unity 2D 敘事遊戲開發:角色立繪與 UI 對話框佈局(UI Character Setup)
系列文
從課堂半成品到完整發布:獨立遊戲的30天重生記17
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言