using System; using UnityEngine; public abstract class MonoSingleton : MonoBehaviour where T : MonoSingleton { private static T instance { get { if (MonoSingleton.m_Instance != null) { return MonoSingleton.m_Instance; } Type typeFromHandle = typeof(T); T t = UnityEngine.Object.FindObjectOfType(typeFromHandle) as T; if (t == null) { string text = typeFromHandle.ToString(); GameObject gameObject = new GameObject(text, new Type[] { typeFromHandle }); t = gameObject.GetComponent(); if (t == null) { Debug.LogError("Problem during the creation of " + text, gameObject); } } else { MonoSingleton.Initialize(t); } return MonoSingleton.m_Instance; } } private static void Initialize(T instance) { if (MonoSingleton.m_Instance == null) { MonoSingleton.m_Instance = instance; MonoSingleton.m_Instance.OnInitialize(); } else if (MonoSingleton.m_Instance != instance) { UnityEngine.Object.DestroyImmediate(instance.gameObject); } } private static void Destroyed(T instance) { if (MonoSingleton.m_Instance == instance) { MonoSingleton.m_Instance.OnFinalize(); MonoSingleton.m_Instance = (T)((object)null); } } public virtual void OnInitialize() { } public virtual void OnFinalize() { } private void Awake() { UnityEngine.Object.DontDestroyOnLoad(base.gameObject); MonoSingleton.Initialize(this as T); } private void OnDestroy() { MonoSingleton.Destroyed(this as T); } protected virtual void OnApplicationQuit() { MonoSingleton.Destroyed(this as T); } private static T m_Instance; }