统一单体模式

问题描述:

它只是一个问题,我错过了统一。统一单体模式

我们经常使用像游戏管理器这样的单件对象,所以有两种方法可以解决这个问题。

一种是使用一个Singleton.cs升C类,如下所示:

using System; 
using System.Linq; 
using UnityEngine; 

public class Singleton<T> : MonoBehaviour where T : MonoBehaviour 
{ 
    static T instance; 

    DateTime BirthTime; 

    public static T Instance 
    { 
     get 
     { 
      if (instance == null) 
       Initialize(); 

      return instance; 
     } 
    } 

    private void Awake() 
    { 
     BirthTime = DateTime.Now; 
    } 

    public static void Initialize() 
    { 
     if (instance == null) 
      instance = FindObjectOfType<T>(); 
    } 
} 

然后得出我们游戏管理作为

GamaManager : Singleton<GameManager> 

在流行的观点,这种方法是CPU消耗,特别是在因为Unity必须遍历许多对象的层次结构,才能使用单例中提到的Initialize方法。

一个更简单的方法是创建私有实例,并在启动或唤醒初始化为:

GameManager : MonoBehaviour 
{ 
    public static GameManager Instance { get; private set; } 

    void Start() 
    { 
     Instance = this; 
    } 
} 

但我认为,它就像一次又一次地写相同的代码。任何人都可以提出一个更清洁的方法吗?

+0

我只能想到一个办法了。使用'GetComponent ()'而不是'FindObjectOfType ()' – Jajan

如果您的游戏管理器类继承了您的泛型单例类并避免使用此类型搜索gameobject会怎么样? 例如:

public class Foo : Singleton<Foo> 

那么你的Foo类将有机会获得“实例”属性,你可以在清醒初始化。

+0

这就是上述类应该如何使用(OP甚至在代码中显示它),也完全无法解决OP的问题。 'Initialize()'是为了在场景中搜索一个单例的现有实例,如果你在单例中调用'DontDestroyOnLoad()'之后加载一个新场景,则可能发生这种情况。在这种情况下,你不想初始化一个新的 - 你想获得现有的引用。 OP在询问是否有更有效的方式在场景中找到该对象。 – Serlite

我不知道你想要什么,但在单件模式,我更喜欢做一个主类像GameManager并利用这段代码将其设置为单例类:

static GameManager _instance; 
    public static GameManager instance { 
     get { 
      if (!_instance) { 
       _instance = FindObjectOfType<GameManager>(); 
      } 
      return _instance; 
     } 
    } 

还是件的代码,然后根据其他子管理器类型定义变量并通过GameManager singleton访问它们。

例如:

public BulletManager myBulletManager; 

,并使用它像这样:

GameManager.instance.myBulletManager.Fire();