public class MonoSingleton<T> : MonoBehaviour where T : MonoSingleton<T>
{
    // T 表示子类类型

    // 单例实例
    private static T instance;
    public static T Instance
    {
        get
        {
            if (instance == null)
            {
                // 在场景中根据类型查找引用
                instance = FindObjectOfType<T>();
                if (instance == null)
                {
                    // 创建脚本对象(立即执行Awake)
                    new GameObject('Singleton of ' + typeof(T)).AddComponent<T>();
                }
                else
                {
                    instance.Init();
                }
            }
            return instance;
        }
    }

    // 在 Awake 方法中初始化单例
    protected void Awake()
    {
        if (instance == null)
        {
            instance = this as T;
            Init();
        }
    }

    // 初始化方法,可被子类覆写
    public virtual void Init()
    {
        // 子类可在这里进行额外的初始化操作
    }
}

注释:

  • MonoSingleton<T> 是一个泛型类,用于实现单例模式的 MonoBehavior 类。
  • T 表示子类的类型,限定子类必须是 MonoSingleton<T> 的派生类。
  • private static T instance 是单例实例变量。
  • public static T Instance 是获取单例实例的静态属性。
  • Awake 方法在脚本对象被创建时调用,用于初始化单例。
  • Init 方法是一个虚方法,可被子类覆写,用于完成额外的初始化操作。
Unity C# 单例模式:MonoSingleton<T> 实现

原文地址: https://www.cveoy.top/t/topic/nBy 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录