Unity 中的單例

雖然有一些思想學派提出了令人信服的論據,為什麼不受限制地使用 Singletons 是一個壞主意,例如 gameprogrammingpatterns.com 上的 Singleton ,有時候你可能想要在 Unity 中將多個場景中的 GameObject 持久化(例如,用於無縫背景音樂)同時確保不超過一個例項存在; Singleton 的完美用例。

通過將此指令碼新增到 GameObject,一旦它被例項化(例如,通過將其包含在場景中的任何位置),它將在場景中保持活動狀態,並且只存在一個例項。

對於某些用例, ScriptableObjectUnityDoc )例項為單例提供了有效的替代方法。雖然它們不會隱式強制執行單例項規則,但它們在場景之間保持狀態,並且與 Unity 序列化過程很好地協作。它們還通過編輯器注入依賴關係來促進控制反轉

// MyAudioManager.cs
using UnityEngine;

[CreateAssetMenu] // Remember to create the instance in editor
public class MyAudioManager : ScriptableObject {
    public void PlaySound() {}
}
// MyGameObject.cs
using UnityEngine;

public class MyGameObject : MonoBehaviour
{
    [SerializeField]
    MyAudioManager audioManager; //Insert through Inspector

    void OnEnable()
    {
        audioManager.PlaySound();
    }
}

進一步閱讀