在Unity3D里,如何创建一个单例游戏管理的好方法,可以作为静态变量全局类被访问,为每一个抽出值的类输出相同的常量值?在Unity里实现它的方法是什么?我需要把它添加到GameObject吗?是否可以让它存在于一个文件夹里,而不在场景中出现? 原文:Unity3D singleton manager classes
来自@Kay 的答案: 这个要看情况。我用两种方法使用单例,一是添加到GameObject的组件,而是作为独立的类,而不是来自于MonoBehaviour。我觉得问题在于实例是如何绑定到场景、游戏对象的lifcycle的。不要忘了有时候组件是很方便的,尤其是引用MonoBehaviour对象时,更加简单安全。 有些类只需要提供一些值,例如config类只需要在调用时从持久层加载设置。我把这种类设计成简单的单例。 另一方面,有些对象需要在场景启动时就需要知道,例如,在更新或其他函数中,Start被调用或者需要执行操作。那么我就把它们作为组件执行,把它们添加到加载新场景时仍然存在的游戏对象上。 我设计基于单例(类型2)的组件的两个部分:一个叫做Main的永久GameObject,包含所有组件。另一个是叫做MainComponentManager的单例(类型1)来管理它。这里有些DEMO代码: public class MainComponentManger { private static MainComponentManger instance; public static void CreateInstance () { if (instance == null) { instance = new MainComponentManger (); GameObject go = GameObject.Find ("Main"); if (go == null) { go = new GameObject ("Main"); instance.main = go; // 重要:使对象持久化 Object.DontDestroyOnLoad (go); } // 触发其他单利初始化 Component c = MenuManager.SharedInstance; // ... } } public static MainComponentManger SharedInstance { get { if (instance == null) { CreateInstance (); } return instance; } } public static T AddMainComponent <T> () where T : UnityEngine.Component { T t = SharedInstance.main.GetComponent<T> (); if (t != null) { return t; } return SharedInstance.main.AddComponent <T> (); } 现在,其他先注册成为Main组件的单例是这个样子的: public class AudioManager : MonoBehaviour { private static AudioManager instance = null; public static AudioManager SharedInstance { get { if (instance == null) { instance = MainComponentManger.AddMainComponent<AudioManager> (); } return instance; } }
来自@Kay 的答案:
这个要看情况。我用两种方法使用单例,一是添加到GameObject的组件,而是作为独立的类,而不是来自于MonoBehaviour。我觉得问题在于实例是如何绑定到场景、游戏对象的lifcycle的。不要忘了有时候组件是很方便的,尤其是引用MonoBehaviour对象时,更加简单安全。
我设计基于单例(类型2)的组件的两个部分:一个叫做Main的永久GameObject,包含所有组件。另一个是叫做MainComponentManager的单例(类型1)来管理它。这里有些DEMO代码:
现在,其他先注册成为Main组件的单例是这个样子的: