📜  unity singleton - C# 代码示例

📅  最后修改于: 2022-03-11 14:48:53.706000             🧑  作者: Mango

代码示例2
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

public abstract class Singleton : MonoBehaviour where T : Singleton
{
    #region  Variables
    protected static bool Quitting { get; private set; }

    private static readonly object Lock = new object();
    private static Dictionary> _instances;

    public static T Instance
    {
        get
        {
            if (Quitting)
            {
                return null;
            }
            lock (Lock)
            {
                if (_instances == null)
                    _instances = new Dictionary>();

                if (_instances.ContainsKey(typeof(T)))
                    return (T)_instances[typeof(T)];
                else
                    return null;
            }
        }
    }

    #endregion

    #region  Methods
    private void OnEnable()
    {
        if (!Quitting)
        {
            bool iAmSingleton = false;

            lock (Lock)
            {
                if (_instances == null)
                    _instances = new Dictionary>();

                if (_instances.ContainsKey(this.GetType()))
                    Destroy(this.gameObject);
                else
                {
                    iAmSingleton = true;

                    _instances.Add(this.GetType(), this);

                    DontDestroyOnLoad(gameObject);
                }
            }

            if(iAmSingleton)
                OnEnableCallback();
        }
    }

    private void OnApplicationQuit()
    {
        Quitting = true;

        OnApplicationQuitCallback();
    }

    protected abstract void OnApplicationQuitCallback();

    protected abstract void OnEnableCallback();
    #endregion
}