Unity 場景切換時默認銷毀當前場景所有對象。DontDestroyOnLoad 可使指定 GameObject 存活,常用於音樂管理器、數據管理器、單例服務等。
using UnityEngine;
public class MusicManager : MonoBehaviour {
void Awake() {
DontDestroyOnLoad(gameObject);
// 初始化邏輯:讀取設置、播放背景音樂等
}
}
將此腳本掛載在場景中的 GameObject 上,場景切換時該物件不會被銷毀。
舊版本來回切換場景會導致多次執行 Awake,產生多個實例。解決:靜態標記單例。
public class MusicManager : MonoBehaviour {
static MusicManager instance;
void Awake() {
if (instance != null) { Destroy(gameObject); return; }
instance = this;
DontDestroyOnLoad(gameObject);
}
}
宣雨松博客推薦的靜態構造函數單例,更優雅:
public class Global : MonoBehaviour {
public static Global instance;
static Global() {
GameObject go = new GameObject("Global");
DontDestroyOnLoad(go);
instance = go.AddComponent();
}
public void DoSomething() { Debug.Log("DoSomething"); }
void Start() { Debug.Log("Start"); }
}
// 使用
Global.instance.DoSomething();
優點:
Global.instance.Method()。Destroy)。LoadSceneMode.Additive) 下同樣有效。DontDestroyOnLoad 是 Unity 跨場景數據持久化的基石,配合單例模式構建健壯的遊戲架構核心。