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

长久以来,对于基于MonoBehaviour的单例总是心有梗结,总觉得用得很忐忑,今天,终于有时间思考和总结了下,理清了想通了.代码和注释如下: 其中GameLogic是我们自己的控制游戏生命周期的管理类,当游戏进行中,GameLogic.AddComponent总是成功的添加组件到一个标记为DontDestroyOnLoad的对象上,这样保证单例的生命期. 当游戏结束后,开始数据清理时,如果调用 GameLogic.AddComponent就会返回null,这样保证在游戏结束的清理工作中已销毁…
可能习惯了写单例的朋友,或者常规的单例模式 会这样做 private static Single instance; public static Single Instance(){ if (instance == null) { instance = new Single(); } return instance; } 但是当你继承了MonoBehaviour 你就要小心了如果你这样写 public class Single : MonoBehaviour { private static S…
  上一篇文章中说到的manager of managers,其中每个manager都是单例的实现,当然也可以使用静态类实现,但是相比于静态类的实现,单例的实现更为通用,可以适用大多数情况. 如何设计这个单例的模板?   先分析下需求,当设计一个manager时候,我们希望整个程序只有一个该manager对象实例,一般马上能想到的实现是这样的: public class XXXManager { private static XXXManager instance = null; private…
Unity 游戏框架搭建 2018 (二) 单例的模板与最佳实践 背景 很多开发者或者有经验的老手都会建议尽量不要用单例模式,这是有原因的. 单例模式是设计模式中最简单的也是大家通常最先接触的一种设计模式.在框架的设计中一些管理类或者系统类多多少少都会用到单例模式,比如 QFramework 中的 UIMgr,ResMgr 都是单例.当然在平时的游戏开发过程中也会用到单例模式,比如数据管理类,角色管理类等等,以上这些都是非常常见的使用单例的应用场景. 那么今天笔者想好好聊聊单例的使用上要注意的问…
借鉴自:http://www.cnblogs.com/CodeCabin/p/unity_global_manager.html 实现复杂一些的全局控制,如切换游戏关卡等操作,更常用的方式是使用单例类. 单例类的实现又分为两种: 继承自MonoBehaviour的单例类 纯C#的单例类 前者的优点是: 可以在Inspector中显示,便于赋值和查看变量等: 可以利用MonoBehaviour的接口: 可以使用Coroutine. 等等. 缺点也很多,主流的观点是能不继承MonoBehaviour…
单例模式是设计模式中最为常见的,不多解释了.但应该尽量避免使用,一般全局管理类才使用单例. 普通泛型单例: public abstract class Singleton<T> where T : class, new() { private static T instance = null; private static readonly object locker = new object(); public static T Instance { get { lock (locker)…
  上一篇文章讲述了如何设计C#单例的模板.也随之抛出了问题: 如何设计接收MonoBehaviour生命周期的单例的模板? 如何设计? 先分析下需求:   1.约束脚本实例对象的个数.   2.约束GameObject的个数.   3.接收MonoBehaviour生命周期.   4.销毁单例和对应的GameObject.   首先,第一点,约束脚本实例对象的个数,这个在上一篇中已经实现了.   但是第二点,约束GameObject的个数,这个需求,还没有思路,只好在游戏运行时判断有多少个Ga…
/// <summary> /// 通用的单例制作器 /// </summary> /// <typeparam name="T"></typeparam> public class UniversalSingletonGeneator<T> where T : Form,new() { private static T t = null; public static T CreateSingleton() { if (t =…
using UnityEngine; public class CommSystem: SingletonGeneric<CommSystem> { public static string version = "v1.0"; private static CommSystemStub stub = (new GameObject("CommSystemStub")).AddComponent<CommSystemStub>(); } pub…
//单例类定义#define CLASS_INSTANCE_DEF(className) \public: \ static className* GetInstance() \ { \ static className m_Instance; \ return &m_Instance; \ } \private: \ className() {} \ ~className() {} \ className(const className&) = delete; \ className&a…