Unity游戏框架设计之单例Mono

Unity游戏框架设计之单例Mono

简单介绍

在编写 Unity 脚本的过程中,我们通常需要编写一些依赖于 MonBehaviour 生命周期且全局始终唯一的类,比如 EventManager、MessageManager、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)
            {
                _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;
        }
        Destroy(gameObject);
    }
}

代码说明

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

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

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

后记

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

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值