单例模板

背景

  单例模式在游戏中运用广泛,但是每次在一个类中声明单例都需要手写一遍,带来的后果就是代码重复、每次写的单例还可能不一样、多人协作开发时单例的实现方式可能各不相同。所以便创建了单例模板,用于规范单例的书写,外部不需要关心单例内部如何实现,达到即装即用的目的。

使用

创建单例

  1. 无需创建GameObject,不需要依赖mono的
    将音效模块SFXManager声明为单例:
    直接继承BaseSingleTon即可,<>中填入对应的类名

    1
    public class SFXManager : BaseSingleTon<SFXManager>
  2. 需要依赖mono或需要创建GameObject的
    以中央管理系统GameManager举例:

    1
    public class GameManager : MonoSingleton<GameManager>

调用单例

调用单例对象的函数通过-> 类名.Instance.函数名

1
2
3
4
// 调用SFXManager播放音效
SFXManager.Instance.PlaySfx("sfxName");
// 调用GameManager执行协程 CloseWindowIEnumerator()
GameManager.Instance.StartCoroutine(CloseWindowIEnumerator());

注意事项

  1. 基本上除了GameManager继承自Mono单例,其他需求都尽量继承非mono单例,生命周期交由GameManager管理,详见中央管理器GameManager。目的是方便模块管理和调试,以及脱离对mono的依赖,使模块更独立,与外部耦合度更低。
  2. 使用单例前,一定要明确需求,是否一定要通过单例来调用函数,是否全局仅一份实例,不能为了图方便而去使用单例,不该用单例的地方用单例,这样会导致单例泛滥,使得项目难以维护。一般来说,以模块或以系统为单位的可以使用单例,像背包系统,可以全局仅维护一份,其再维护所有背包。

内部实现

类内部进行对象的实例化操作:
BaseSingleTon:Scripts/Core/Base/Singleton/BaseSingleTon

类内部进行对象实例化时,会多一步操作,检测已有实例对象GameObjcet,有的话进行Destory,确保只有一个实例:
MonoSingleton:Scripts/Core/Base/Singleton/MonoSingleton