长久以来,对于基于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
}

关于MonoBehaviour的单例通用规则的更多相关文章

  1. unity3d - new 不出的单例

    可能习惯了写单例的朋友,或者常规的单例模式 会这样做 private static Single instance; public static Single Instance(){ if (inst ...

  2. Unity 游戏框架搭建 (二) 单例的模板

      上一篇文章中说到的manager of managers,其中每个manager都是单例的实现,当然也可以使用静态类实现,但是相比于静态类的实现,单例的实现更为通用,可以适用大多数情况. 如何设计 ...

  3. Unity 游戏框架搭建 2018 (二) 单例的模板与最佳实践

    Unity 游戏框架搭建 2018 (二) 单例的模板与最佳实践 背景 很多开发者或者有经验的老手都会建议尽量不要用单例模式,这是有原因的. 单例模式是设计模式中最简单的也是大家通常最先接触的一种设计 ...

  4. Unity 单例写法

    借鉴自:http://www.cnblogs.com/CodeCabin/p/unity_global_manager.html 实现复杂一些的全局控制,如切换游戏关卡等操作,更常用的方式是使用单例类 ...

  5. 设计模式——通用泛型单例(普通型和继承自MonoBehaviour)

    单例模式是设计模式中最为常见的,不多解释了.但应该尽量避免使用,一般全局管理类才使用单例. 普通泛型单例: public abstract class Singleton<T> where ...

  6. Unity 游戏框架搭建 (三) MonoBehaviour单例的模板

      上一篇文章讲述了如何设计C#单例的模板.也随之抛出了问题: 如何设计接收MonoBehaviour生命周期的单例的模板? 如何设计? 先分析下需求:   1.约束脚本实例对象的个数.   2.约束 ...

  7. C# 通用单例窗体类

    /// <summary> /// 通用的单例制作器 /// </summary> /// <typeparam name="T"></t ...

  8. MonoBehaviour单例的另外一种省事的写法

    using UnityEngine; public class CommSystem: SingletonGeneric<CommSystem> { public static strin ...

  9. c++ 通用单例类声明

    //单例类定义#define CLASS_INSTANCE_DEF(className) \public: \ static className* GetInstance() \ { \ static ...

随机推荐

  1. windows上zeal安装和使用--离线API文档

    1.官网:https://zealdocs.org/download.html#windows 2.github:https://github.com/zealdocs/zeal 3.下载:可下载安装 ...

  2. div绝对定位居中

    绝对定位absolute,left:50%,加上margin-left:-(宽度/2),可以实现绝对位置居中 .list{ width: 1200px; height: 300px; overflow ...

  3. 简单的物流项目实战,WPF的MVVM设计模式(三)

    往Services文件里面添加接口以及实现接口 IUserService接口 List<User> GetAllUser(); GetUserService类 ConnectToDatab ...

  4. iOS特殊界面旋屏设置的方法之一

    1.AppDelegate.h @property (assign, nonatomic) BOOL allowRotation; 2.AppDelegate.m #pragma mark - 自动旋 ...

  5. Apache 的 httpd-mpm.conf 文件详解

    #prefork 多路处理模块 <IfModule mpm_prefork_module> StartServers              5   #设置服务器启动时建立的子进程数量, ...

  6. Qt项目管理文件(.pro)及其作用详解

    http://c.biancheng.net/view/1819.html 在 Qt Creator 中新建一个 Widget Application 项目 samp2_1,在选择窗口基类的页面选择 ...

  7. PAT Basic 1028 人口普查 (20 分)

    某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 200 岁的老人,而今天是 2014 ...

  8. Andronov-Hopf bifurcation

    地址:http://www.scholarpedia.org/article/Andronov-Hopf_bifurcation Andronov-Hopf bifurcation is the bi ...

  9. 如何设置Linux虚拟机的IP地址

    本文会详细的解释如何在Linux虚拟机下设置IP地址 我的虚拟机是CentOS 首先,打开你的虚拟机 1.修改主机名 修改完主机名之后,别忘了用:wq命令保存退出 然后我们来设置虚拟机的IP地址 首先 ...

  10. 构建游戏开发的大数据项目的流程demo图