一、前言
在前面的文章中,我們陸續完成了成就系統、UI 介面、對話觸發與本地存檔。當專案的規模越來越大、元件愈拉愈多時,最讓人頭痛的日常就是「執行遊戲時突然卡住或噴一堆紅字」。今天這篇除蟲特輯,我們要來聊聊開發者必經的痛點——如何擺脫不友善的 NullReferenceException,並透過主動防禦性編程(Defensive Programming)來拯救常忘記拉線的自己。
二、核心痛點剖析:為什麼總是漏拉 Inspector 欄位?
在 Unity 中,我們習慣用 [SerializeField] 將腳本的變數暴露在 Inspector 給美術或自己拉線(例如 UI 圖片、文字、音效來源等)。但隨著場景越來越多,常常會發生一種狀況:

三、核心程式實作:用主動防禦取代被動崩潰
與其讓 Unity 丟出難以追查的系統崩潰,我們不如在程式碼進入核心邏輯前,先主動進行空值檢查(Null Check),並用帶有提示性的 Debug.LogError 幫自己「抓蟲」。
以我們專案中的 DialogueManager 為例,我們加入了以下防禦性檢查:
using UnityEngine;
public class DialogueManager : MonoBehaviour {
[Header("音效元件參考")]
[SerializeField] private AudioSource voiceAudioSource;
public void PlayVoice(AudioClip clip) {
// 主動防禦:在呼叫前先檢查是否有漏拉 Inspector 欄位
if (voiceAudioSource == null) {
Debug.LogError("【DialogueManager】錯誤:你忘記在 Inspector 裡把 Voice Audio Source 欄位拉入了!", this);
return;
}
voiceAudioSource.PlayOneShot(clip);
}
}
這樣一來,就算哪天不小心手殘或眼殘漏拉了欄位,遊戲也不會直接暴斃,而是會在 Console 精準地跳出專屬的警告紅字,一眼就能知道問題出在哪裡!
圖二、改良後的噴錯警告
四、Unity Editor 與除錯工具應用步驟
1. 善用 Console 的錯誤導航:

2. 利用物件關聯(Context)快速定位:

五、開發實戰經驗:踩坑與架構反思
六、今日成果與小結
今天的內容是關於「防禦性編程(Defensive Programming)與除蟲優化」,透過在程式碼中加入空值檢查(Null Check)與帶有上下文的 Debug.LogError(..., this) 來優化對話與音效系統的錯誤處理機制。因為這屬於專案整體的程式碼重構、品質優化與除錯防護,它通常不屬於單一功能的新分支,而是適合放在 main 分支。
1.檢查修改狀態
git status
2.切換回主分支 main
git checkout main
3.同步一下遠端的最新狀態
git pull origin main
4.加入暫存區並提交 Commit
git add .
git commit -m "refactor: 導入防禦性編程與空值檢查,優化 NullReferenceException 錯誤提示與除錯效率"
5.推送到遠端主分支
git push origin main