首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

Unity3D DontDestroyOnLoad:跨場景保持對象不銷毀

     編輯:C++ 入門

Unity3D DontDestroyOnLoad:跨場景保持對象不銷毀

Unity 場景切換時默認銷毀當前場景所有對象。DontDestroyOnLoad 可使指定 GameObject 存活,常用於音樂管理器、數據管理器、單例服務等。

基本用法

using UnityEngine;
public class MusicManager : MonoBehaviour {
    void Awake() {
        DontDestroyOnLoad(gameObject);
        // 初始化邏輯:讀取設置、播放背景音樂等
    }
}

將此腳本掛載在場景中的 GameObject 上,場景切換時該物件不會被銷毀。

Unity 4.5 之前的 Bug 與修復

舊版本來回切換場景會導致多次執行 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();

優點:

  • 靜態構造函數只執行一次,天然單例。
  • 自動創建 GameObject 並掛載腳本,無需場景預置。
  • 調用簡潔:Global.instance.Method()。

適用場景

  1. 背景音樂播放器
  2. 遊戲數據管理器(存档、設置)
  3. 網絡管理器、對象池管理器
  4. 任何跨場景共享的服務

注意事項

  • 被保持的物件不會自動清理,需手動管理生命週期(如遊戲結束時 Destroy)。
  • 場景加載時若已存在同名單例,需避免重複創建(靜態單例模式自動處理)。
  • 多場景加載模式 (LoadSceneMode.Additive) 下同樣有效。

DontDestroyOnLoad 是 Unity 跨場景數據持久化的基石,配合單例模式構建健壯的遊戲架構核心。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved