UFL1-2——继承MonoBehaviour的单例模式基类
UFL1-2——继承MonoBehaviour的单例模式基类
继承MonoBehaviour
的单例模式对象,建议大家使用自动挂载式的方案,其潜在的安全问题相对较小,制定好规则后可以忽略不计
前置知识点
大体知识体系
- C#相关知识点(C#四部曲)、Unity相关知识点(Unity四部曲)
细节知识点
- 上节课的相关细节知识点
- MonoBehaviour相关知识点(Unity四部曲之Unity入门中)
实现继承MonoBehaviour的单例模式基类的注意事项
继承
MonoBehaviour
的类不可以new()
!!!继承
MonoBehaviour
的脚本一定得依附在GameObject上!!!
实现挂载式的单例模式基类
这种方式不建议大家使用,因为很容易被破坏单例模式的唯一性,这种单例模式基类存在以下的问题:
- 可能会手动挂载了多个脚本
- 切换场景回来时,由于场景放置了挂载脚本的对象,回到该场景时 又会有一个该单例模式对象
- 还可以通过代码动态的添加多个该脚本,也会破坏唯一性
1 | using System; |
使用方法
如果想要在管理器里初始化,只需要重写Awake
方法然后初始化即可,但是base.Awake()
是不可删除的!!!
1 | public class TestMonoMgr : SingletonMono<TestMonoMgr> |
使用前先将继承了SingletonMono<>
的TestMonoMgr
挂载到场景上的某个对象上:
1 | using System; |
输出:
自动挂载式的单例模式基类
推荐使用这种方式实现的继承Mono的单例模式基类,因为它无需手动挂载和动态添加,也无需关心多线程或者切换场景带来的问题
1 | using UnityEngine; |
使用方法
管理器示例:
1 | public class TestMonoMgr2 : SingletonAutoMono<TestMonoMgr2> |
使用管理器示例:
1 | using System; |
输出:
同时可以看见与管理器对应的游戏对象被创建出来:
对于潜在的安全问题
-
构造函数问题:继承
MonoBehaviour
的函数,不能new()
,所以不用担心公共构造函数继承
MonoBehaviour
的函数,不能new()
,所以不用担心公共构造函数 -
多线程问题:Unity主线程中相关内容,不允许其他线程直接调用,很少有这样的需求,所以也不用太担心
Unity主线程中相关内容,不允许其他线程直接调用,很少有这样的需求,所以也不用太担心
-
重复挂载问题:
- 手动重复挂载
- 代码重复添加
需要人为干涉,定规则,或者通过代码逻辑强制处理
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 文KRIFE齐的博客!