using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class Singel : MonoBehaviour { } public class BaseSingleton where T : new() { private static T instance; //保护构造函数,保证单例只能在内部创建 protected BaseSingleton() { } public static T Instance { get { if (instance == null) { instance = new T(); } return instance; } } } public abstract class MonoSingleton : MonoBehaviour where T : MonoSingleton { private static T instance; private readonly static object obj = new object(); public static T Instance { get { if (instance != null) { return instance; } lock (obj) { Type type = typeof(T); // 改用 Resources.FindObjectsOfTypeAll 来查找所有的实例(包括禁用的对象) T[] instances = Resources.FindObjectsOfTypeAll(); // 如果场景中存在多个实例,抛出异常 if (instances.Length > 1) { Debug.Log(new Exception(string.Format("Singleton类型{0}存在多个实例", type.Name))); instance = instances[0]; // 默认选择第一个实例 return instance; } // 如果场景中找到了唯一的实例,直接返回 if (instances.Length == 1) { instance = instances[0]; return instance; } // 如果没有找到实例,实例化一个空物体并添加T脚本 instance = new GameObject("Singleton Of " + typeof(T).Name.ToString(), typeof(T)).GetComponent(); Debug.LogError("创建了新的"); return instance; } } } virtual public void Awake() { // 如果 `instance` 已经被初始化(即通过 `Instance` 属性),销毁当前挂载的实例 if (instance == null) { instance = this as T; } } }