Unity遊戲管理器:跨場景持久化問題及解決方案
問題:
旨在跨場景持久化的遊戲管理器腳本,即使存在於所有場景中,也只在專案初始化時執行一次。
原因:
每個Unity專案都需要一個「預先載入場景」(preload scene),作為持久化物件和系統的中心樞紐。此場景必須在建置設定中指定為場景0。
解:
建立預先載入場景:
新增預先載入遊戲物件:
應用DontDestroyOnLoad:
在預先載入場景中放置通用行為:
在其他場景中找出組件:
要從其他場景存取這些持久化元件,可以使用靜態方法「Object.FindObjectOfType
<code class="language-C#">SoundEffects sound = Object.FindObjectOfType<SoundEffects>(); GameState state = Object.FindObjectOfType<GameState>();</code>
可選最佳化:
為了減少程式碼重複,可以考慮使用以下全域腳本:
<code class="language-C#">public static class App { public static SoundEffects SoundEffects { get; private set; } public static GameState GameState { get; private set; } static App() { GameObject appObject = GameObject.Find("__app"); SoundEffects = appObject.GetComponent<SoundEffects>(); GameState = appObject.GetComponent<GameState>(); } }</code>
使用此腳本,您可以使用簡化的語法存取這些元件:
<code class="language-C#">App.SoundEffects.PlayExplosion(); App.GameState.CurrentLevel = 5;</code>
開發便利性:
為了提高開發效率,可以考慮在「preload」場景中新增一個腳本,如果不存在「__app」對象,則在專案初始化時自動載入「preload」場景。這確保了每次單擊“Play”時遊戲都從“preload”場景啟動。
以上是為什麼我的 Unity 遊戲管理器腳本只運行一次,以及如何使其在場景中持久存在?的詳細內容。更多資訊請關注PHP中文網其他相關文章!