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();
    }
}

进一步阅读