Unity游戏框架设计之单例Mono

Unity游戏框架设计之单例 Mono

简单介绍

在编写 Unity 脚本的过程中,我们通常需要编写一些依赖于 MonBehaviour 生命周期且全局始终唯一的类,比如 EventManager、TaskManager、ResourceManager 和 UIManager 等等。

我们可以基于单例模式,设计出名为 SingletonMono 的单例类,然后让拥有上述特性的类继承于 SingletonMono 单例类,来保证这些类在游戏运行过程中始终唯一。

一般的脚本必须依赖于某个场景中的某个游戏对象。而在游戏运行的过程中,我们可能频繁的切换 Scene,而这可能导致我们在切换场景的过程中,不小心将 SingletonMono 单例类销毁,从而造成错误。因此我们需要将脚本依赖的游戏对象放到 DontDestroyOnLoad() 中,来保证场景切换不会导致 SingletonMono 单例类的销毁。

代码设计

public abstract class SingletonMono<T> : MonoBehaviour where T : MonoBehaviour
{
    private static T _instance;

    public static T Instance
    {
        get
        {
            if (_instance == null)
            {
                Debug.LogWarning("必须先将组件添加到游戏对象上才能使用 Instance 实例。");
                _instance = FindObjectOfType<T>();
                if (_instance == null)
                {
                    GameObject gameObject = new GameObject();
                    DontDestroyOnLoad(gameObject);
                    gameObject.name = typeof(T).Name;
                    _instance = gameObject.AddComponent<T>();
                }
            }
            return _instance;
        }
    }

    protected virtual void Awake()
    {
        if (_instance == null)
        {
            DontDestroyOnLoad(gameObject);
            _instance = this as T;
            return;
        }
        Debug.LogWarning(("禁止多次创建单例脚本。"));
        Destroy(gameObject);
    }
}

代码说明

(一)游戏中所有需要使用 Unity 生命周期的单例类必须继承 SingletonMono,特别是 XXXMananger 类。

(二)保证所有继承 SingletonMono 类的脚本在游戏中全局唯一。

(三)保证所有继承 SingletonMono 类的脚本不会随着场景的卸载而销毁。

后记

由于个人能力有限,文中不免存在疏漏,恳求大家斧正,一起交流,共同进步。

热门相关:哥哥,我们应该做秘密朋友吗   史上第一密探   我向斐少撒个娇   驭房之术   大唐扫把星