MayHeCome/Assets/三问c#/动画器/Singel.cs

77 lines
2.2 KiB
C#
Raw Normal View History

2024-12-18 09:55:34 +00:00
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Singel : MonoBehaviour
{
}
public class BaseSingleton<T> 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<T> : MonoBehaviour where T : MonoSingleton<T>
{
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<T>();
// 如果场景中存在多个实例,抛出异常
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<T>();
Debug.LogError("创建了新的");
return instance;
}
}
}
virtual public void Awake()
{
// 如果 `instance` 已经被初始化(即通过 `Instance` 属性),销毁当前挂载的实例
if (instance == null)
{
instance = this as T;
}
}
}