一个 Unity 下的 MonoBehaviour 泛型单例基类,用于为场景中唯一存在的脚本自动创建并管理实例。
- 泛型基类:通过
MonoSingletonBase<T>约束,子类无需重复编写单例逻辑。 - 按需加载:首次访问
Instance时才创建/查找实例,避免 Awake 阶段相互引用导致的Null异常。 - 自动建对象:若场景中未挂载该脚本,会自动创建一个空 GameObject 并挂上组件。
- 统一初始化入口:提供
Init()虚方法,子类可重写用于初始化,保证只执行一次。
| 文件 | 说明 |
|---|---|
MonoSingletonBase.cs |
单例基类,命名空间 Common |
- 将脚本放入项目的
Common命名空间(已默认包含)。 - 让你的脚本继承该类,并将自身作为泛型参数:
using Common;
using UnityEngine;
public class GameManager : MonoSingletonBase<GameManager>
{
protected override void Init()
{
// 在这里做初始化(替代 Awake,避免 Null 问题)
Debug.Log("GameManager 初始化完成");
}
public void DoSomething()
{
Debug.Log("做点事情");
}
}- 任意地方通过
Instance访问:
GameManager.Instance.DoSomething();Instance的get访问器实现按需加载:已存在则直接返回;不存在则先FindObjectOfType查找,找不到就自动new GameObject().AddComponent<T>()。Awake()中把instance指向自身并调用Init(),确保已挂载在场景中的脚本也能正确初始化。- 子类如需初始化逻辑,重写
protected virtual void Init()即可(可不用)。
- 该单例基于场景中的 GameObject,不会跨场景持久化。如需跨场景保留,请在子类
Awake中调用DontDestroyOnLoad(gameObject)。 - 多个同类型组件挂在场景里时,以第一个被
Awake初始化的实例为准。