Unity3D单例管理类的好方法?

在Unity3D里,如何创建一个单例游戏管理的好方法,可以作为静态变量全局类被访问,为每一个抽出值的类输出相同的常量值?在Unity里实现它的方法是什么?我需要把它添加到GameObject吗?是否可以让它存在于一个文件夹里,而不在场景中出现?

原文:Unity3D singleton manager classes

阅读 9.5k
1 个回答

来自@Kay 的答案:

这个要看情况。我用两种方法使用单例,一是添加到GameObject的组件,而是作为独立的类,而不是来自于MonoBehaviour。我觉得问题在于实例是如何绑定到场景、游戏对象的lifcycle的。不要忘了有时候组件是很方便的,尤其是引用MonoBehaviour对象时,更加简单安全。

  1. 有些类只需要提供一些值,例如config类只需要在调用时从持久层加载设置。我把这种类设计成简单的单例。
  2. 另一方面,有些对象需要在场景启动时就需要知道,例如,在更新或其他函数中,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;
        }
    }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进