MayHeCome/Assets/三问c#/动画器/Singel.cs
2024-12-18 17:55:34 +08:00

77 lines
2.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}
}
}