跳到主要内容

模块介绍

重要 注意 提醒

Coding Style wiki


基本说明

单例模式,支持 MonoSingleton (MonoBehaviour)NewSingleton (class) 两种单例基类,提供线程安全的延迟创建场景查找或自动创建实例DontDestroyOnLoad 跨场景常驻控制OnCreate / OnStart / OnRelease 生命周期挂钩

  • 版本:v1.0.2 (com.michaelo.oxgkit.singletonsystem)
  • 命名空间:OxGKit.SingletonSystem

提醒 本模块无任何第三方依赖,可独立安装使用。


应用说明

两种单例基类

基类说明
MonoSingleton<T>MonoBehaviour 单例基类,获取实例时会优先查找场景上的既有实例,否则自动创建 GameObject 挂载组件,支持 DontDestroyOnLoad 常驻控制,并提供 OnCreate / OnStart / OnRelease 生命周期挂钩。
NewSingleton<T>纯 C# class 单例基类 (非 MonoBehaviour),以 new T() 延迟创建实例 (双重检查锁定)。

生命周期挂钩 (MonoSingleton)

MonoSingleton<T> 已将 Unity 的 Awake()Start()OnDestroy() 实现为基类私有方法,改由以下挂钩实现逻辑:

挂钩触发时机
OnCreate()由 Unity Awake 触发
OnStart()由 Unity Start 触发
OnRelease()由 Unity OnDestroy 触发

重要 不可实现 Awake()Start()OnDestroy() (基类已占用),其余 Unity 方法 (UpdateOnEnable 等) 均可正常实现。

DontDestroyOnLoad 控制

  • 场景预先放置:实例于 Awake 自动注册为单例,依 Inspector 上的 dontDestroyOnLoad 字段 (默认 true) 决定是否跨场景常驻。
  • 代码动态创建:由首次 GetInstance(dontDestroyOnLoad) / InitInstance(dontDestroyOnLoad) 调用的参数决定 (默认 true)。

注意 dontDestroyOnLoad首次创建实例时生效,请于第一次获取实例的调用点决定并保持一致。

脚本模板创建

通过 Right-Click Create/OxGKit/SingletonSystem/Template Mono Singleton.cs 快速创建 MonoSingleton 模板脚本。


简单使用

实现 MonoSingleton

using OxGKit.SingletonSystem;

public class GameManager : MonoSingleton<GameManager>
{
// |-------------------------------------------------------------------------------------|
// | Note: Except Awake(), Start() and OnDestroy(), other Unity methods can be override. |
// |-------------------------------------------------------------------------------------|

protected override void OnCreate()
{
/**
* Do Somethings OnCreate In Here (Call by Unity.Awake)
*/
}

protected override void OnStart()
{
/**
* Do Somethings OnStart In Here (Call by Unity.Start)
*/
}

protected override void OnRelease()
{
/**
* Do Somethings OnRelease In Here (Call by Unity.OnDestroy)
*/
}
}
// 获取实例 (场景查找或自动创建,默认 DontDestroyOnLoad)
GameManager.GetInstance();

// 场景限定单例 (随场景卸载销毁,首次获取时设置一次即可)
GameManager.GetInstance(dontDestroyOnLoad: false);

// 启动时明确初始实例 (warm-up)
GameManager.InitInstance();

// 检查实例是否存在
if (GameManager.CheckInstanceExists()) { /* ... */ }

// 销毁实例 (连同 GameObject)
GameManager.DestroyInstance();

实现 NewSingleton

using OxGKit.SingletonSystem;

public class ScoreManager : NewSingleton<ScoreManager>
{
public int score = 0;

public static void AddScore()
{
GetInstance().score++;
}
}
// 获取实例 (延迟 new T() 创建)
var scoreManager = ScoreManager.GetInstance();
ScoreManager.AddScore();

// 销毁实例 (仅清空静态引用)
ScoreManager.DestroyInstance();

[参考 Example]


Installation

Install via git URL
Add https://github.com/michael811125/OxGKit.git?path=Assets/OxGKit/SingletonSystem/Scripts to Package Manager

第三方库

  • 无 (本模块无任何第三方依赖)。

Samples (Package Manager -> Samples)


模块 API