Unity 中的单例
虽然有一些思想学派提出了令人信服的论据,为什么不受限制地使用 Singletons 是一个坏主意,例如 gameprogrammingpatterns.com 上的 Singleton ,有时候你可能想要在 Unity 中将多个场景中的 GameObject 持久化(例如,用于无缝背景音乐)同时确保不超过一个实例存在; Singleton 的完美用例。
通过将此脚本添加到 GameObject,一旦它被实例化(例如,通过将其包含在场景中的任何位置),它将在场景中保持活动状态,并且只存在一个实例。
对于某些用例, ScriptableObject ( UnityDoc )实例为单例提供了有效的替代方法。虽然它们不会隐式强制执行单实例规则,但它们在场景之间保持状态,并且与 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();
}
}