Files
2026-02-21 16:45:37 +08:00

96 lines
2.1 KiB
C#

using System;
using UnityEngine;
public class UnitySingleton<T> where T : MonoBehaviour
{
private static T _instance;
internal static Type _myType = typeof(T);
internal static GameObject _autoCreatePrefab;
public static int _GlobalInstanceCount;
private static bool _awakeSingletonCalled;
private UnitySingleton()
{
}
public static T GetSingleton(bool throwErrorIfNotFound, bool autoCreate)
{
if (!_instance)
{
UnityEngine.Object obj = null;
UnityEngine.Object[] array = UnityEngine.Object.FindObjectsOfType(_myType);
UnityEngine.Object[] array2 = array;
foreach (UnityEngine.Object obj2 in array2)
{
ISingletonMonoBehaviour singletonMonoBehaviour = (ISingletonMonoBehaviour)obj2;
if (singletonMonoBehaviour.isSingletonObject)
{
obj = (UnityEngine.Object)singletonMonoBehaviour;
break;
}
}
if (!obj)
{
if (!autoCreate || !(_autoCreatePrefab != null))
{
if (throwErrorIfNotFound)
{
Debug.LogError("No singleton component " + _myType.Name + " found in the scene.");
}
return (T)null;
}
GameObject gameObject = UnityEngine.Object.Instantiate(_autoCreatePrefab);
gameObject.name = _autoCreatePrefab.name;
UnityEngine.Object obj3 = UnityEngine.Object.FindObjectOfType(_myType);
if (!obj3)
{
Debug.LogError("Auto created object does not have component " + _myType.Name);
return (T)null;
}
}
else
{
_AwakeSingleton(obj as T);
}
_instance = (T)obj;
}
return _instance;
}
internal static void _Awake(T instance)
{
_GlobalInstanceCount++;
if (_GlobalInstanceCount <= 1)
{
_instance = instance;
}
_AwakeSingleton(instance);
}
internal static void _Destroy()
{
if (_GlobalInstanceCount > 0)
{
_GlobalInstanceCount--;
if (_GlobalInstanceCount == 0)
{
_awakeSingletonCalled = false;
_instance = (T)null;
}
}
}
private static void _AwakeSingleton(T instance)
{
if (!_awakeSingletonCalled)
{
_awakeSingletonCalled = true;
instance.SendMessage("AwakeSingleton", SendMessageOptions.DontRequireReceiver);
}
}
}