using UnityEngine; /// /// 这是一个已经封装好的泛型Mono单例,之后可以在其他地方复用它,免去很多麻烦的写法 /// public class Singleton : MonoBehaviour where T : MonoBehaviour { private static T instance; public static T Instance { get { if (instance == null) { // 在场景中查找是否已存在该类型的实例 instance = FindObjectOfType(); // 如果场景中不存在该类型的实例,则创建一个新的GameObject并添加该组件 if (instance == null) { GameObject singletonObject = new GameObject(typeof(T).Name + "_Singleton"); instance = singletonObject.AddComponent(); DontDestroyOnLoad(singletonObject); // 保留在场景切换时不被销毁 } } return instance; } } //使用virtual虚函数,子类继承可能还需要用Awake() protected virtual void Awake() { // 确保在场景切换时不会销毁该实例 DontDestroyOnLoad(gameObject); // 检查是否存在重复的实例 if (instance == null) { instance = this as T; } else { Debug.LogWarning("存在重复的单例" + typeof(T).Name + "删除"); Destroy(gameObject); } } }