Unity Singleton模式

时间:2017-09-18 19:40:36

标签: c# unity3d singleton

这只是一个让我对Unity产生误解的问题。

我们经常使用像游戏管理器这样的Singleton对象,因此有两种方法可以实现。

一种是使用Singleton.cs c sharp类,如下所示:

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

然后将我们的GameManager派生为

GamaManager : Singleton<GameManager>

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

更简单的方法是创建私有实例并在Start或Awake中将其初始化为:

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

    void Start()
    {
        Instance = this;
    }
}

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

1 个答案:

答案 0 :(得分:1)

我不确定你想要什么,但是在单例模式中,我更喜欢创建一个像GameManager这样的主类,并使用这段代码将其设置为单例类:

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

或者您编写的代码片段,之后根据其他子管理器类型定义变量并通过GameManager单例访问它们。

例如:

public BulletManager myBulletManager;

并像这样使用它:

GameManager.instance.myBulletManager.Fire();