关于MonoBehaviour的单例通用规则

长久以来,对于基于MonoBehaviour的单例总是心有梗结,总觉得用得很忐忑,今天,终于有时间思考和总结了下,理清了想通了。代码和注释如下:

其中GameLogic是我们自己的控制游戏生命周期的管理类,当游戏进行中,GameLogic.AddComponent总是成功的添加组件到一个标记为DontDestroyOnLoad的对象上,这样保证单例的生命期。

当游戏结束后,开始数据清理时,如果调用 GameLogic.AddComponent就会返回null,这样保证在游戏结束的清理工作中已销毁置空的单例不会因为误引用而【死而复生】

class UICanvasManager : MonoBehaviour
    {
        /*** 基于MonoBehaviour的单例规则,保证单例的唯一性和安全性
         * 1,不要手动在编辑器中挂给对象,防止挂重
         * 2,使用如下方式通过GameLogic生成单例,生命周期易控制
         * 3,不要在AWake或其它任何地方给_instance赋值,保证单例唯一,不变。考虑以下【危险案例】
         */

        /*** 【危险案例】
         * 先通过UICanvasManager.Instance获取了一个指向对象A的单例,进行一些操作后,A中有了一些数据,
         * 后面不小心通过AddComponent添加了一个UICanvasManager组件,此时单例指向了对象B
         * 这时候有一些游戏数据在对象A中,有一些数据在对象B中,后果是B中有些你以为已经初始化了的数据却为空
         */

        protected static UICanvasManager _instance;
        public static UICanvasManager Instance
        {
            get
            {
                if(_instance == null)
                {
                    _instance = GameLogic.AddComponent<UICanvasManager>();
                }
                return _instance;
            }//get
        }//Instance
}

 

转载于:https://www.cnblogs.com/timeObjserver/p/11278301.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值