using System; using UnityEngine; public class MonoSingleton : MonoBehaviour where T : Component { private static T _instance; public static T Instance { get { if (_instance == null) { CreateInstance(); } return _instance; } } private static void CreateInstance() { Type theType = typeof(T); _instance = (T)FindObjectOfType(theType); if (_instance == null) { var go = new GameObject(typeof(T).Name); _instance = go.AddComponent(); GameObject rootObj = GameObject.Find("TapSDKSingletons"); if (rootObj == null) { rootObj = new GameObject("TapSDKSingletons"); DontDestroyOnLoad(rootObj); } go.transform.SetParent(rootObj.transform); } } public static void DestroyInstance() { if (_instance != null) { Destroy(_instance.gameObject); } } public static bool HasInstance() { return _instance != null; } protected virtual void Awake() { if (_instance != null && _instance.gameObject != gameObject) { if (Application.isPlaying) { Destroy(gameObject); } else { DestroyImmediate(gameObject); // UNITY_EDITOR } return; } else if (_instance == null) { _instance = GetComponent(); } DontDestroyOnLoad(gameObject); Init(); } protected virtual void OnDestroy() { Uninit(); if (_instance != null && _instance.gameObject == gameObject) { _instance = null; } } protected virtual void Init() {} public virtual void Uninit() {} }