using System; using System.Collections.Generic; using UnityEngine; public class ManagerBase<T> where T : ManagerBase<T> { private static T _instance; public static T Instance { get { if (_instance != null) return _instance; _instance = Activator.CreateInstance<T>(); SingletonManager.Add(_instance); _instance.init(); return _instance; } } protected virtual void init() { } }
public class MonoManagerBase<T> : SimMonoBehaviour where T : MonoManagerBase<T> { protected static T _instance; public static T instance { get { if (_instance != null) return _instance; GameObject obj = new GameObject(typeof(T).ToString()); obj.transform.SetParent(SingletonManager.parent); _instance = obj.AddComponent<T>(); SingletonManager.AddMonoManager(_instance); return _instance; } } protected override void Awake() { if (_instance == null) { _instance = (T)this; _instance.init(); SingletonManager.AddMonoManager(_instance); } base.Awake(); } protected virtual void init() { } protected override void OnDestroy() { base.OnDestroy(); SingletonManager.removeMonoManager(_instance); } }
public static class SingletonManager { private static Transform _parent; public static Transform parent { get { if (_parent == null) { GameObject obj = new GameObject("MonoManager"); _parent = obj.transform; UnityEngine.Object.DontDestroyOnLoad(_parent); } return _parent; } } /// <summary> /// 保存单例 /// </summary> private static List<object> managerList = new List<object>(); /// <summary> /// 基于mono的 /// </summary> private static List<object> monoManagerList = new List<object>(); public static void Add(object ins) { managerList.Add(ins); } public static void AddMonoManager(object ins) { monoManagerList.Add(ins); } public static void removeMonoManager(object ins) { monoManagerList.Remove(ins); } }