Files
2025TapTapGameJam/Assets/Script/Core/MonoSingleton.cs

62 lines
1.9 KiB
C#
Raw Permalink Normal View History

using UnityEngine;
namespace Core
{
/// <summary>
/// MonoBehavior抽象单例基类。确保继承类在场景中只有一个实例并提供全局访问点。
/// </summary>
/// <typeparam name="T">必须是继承自MonoBehaviour的类型。</typeparam>
public class MonoSingleton<T> : MonoBehaviour where T : MonoBehaviour
{
// 存储单例实例
private static T instance;
/// <summary>
/// 静态公共属性,用于获取单例实例(延迟加载)。
/// </summary>
public static T Instance
{
get
{
if (instance == null)
{
// 尝试在场景中查找现有实例
instance = FindObjectOfType<T>();
if (instance == null)
{
// 如果没有,则创建新的游戏对象并附加该组件
GameObject gameObject = new GameObject(typeof(T).Name);
instance = gameObject.AddComponent<T>();
}
}
return instance;
}
}
protected virtual void Awake()
{
// 将当前对象设置为单例实例
if (instance == null)
{
instance = this as T;
return;
}
// 如果场景中已存在其他实例,则销毁当前重复的对象
if (instance != this as T)
{
Destroy(gameObject);
}
}
//清除静态实例,以防止在特定情况下出现“幽灵”实例。
protected virtual void OnDestroy()
{
if (instance == this)
{
instance = null;
}
}
}
}