Files
UnityPackages/Assets/Common/Infrastructure/Runtime/ScriptableObjectSingleton.cs
2025-12-01 12:36:01 +08:00

57 lines
1.8 KiB
C#

using UnityEngine;
namespace JoeSiu.Common.Infrastructure.Runtime
{
/// <summary>
/// <see href="https://youtu.be/6kWUGEQiMUI"/>
/// </summary>
/// <typeparam name="T"></typeparam>
public abstract class ScriptableObjectSingleton<T> : ScriptableObject where T : ScriptableObjectSingleton<T>
{
private static T _instance;
public static T Instance
{
get
{
if (_instance != null) return _instance;
var assets = Resources.LoadAll<T>("");
if (assets.Length > 0)
{
AssignInstance(assets[0]);
}
if (assets.Length > 1)
{
Debug.LogError(
$"[ScriptableObjectSingleton] More than 1 instance of Singleton Scriptable Object of type: {typeof(T)} found");
}
if (!_instance)
{
Debug.LogWarning(
$"[ScriptableObjectSingleton] No instance of type '{typeof(T).Name}' is found, make sure to add it to the Resources folder!");
}
return _instance;
}
}
public static T GetInstance() => _instance;
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
public static void RemoveInstance()
{
_instance = null;
Debug.Log($"[ScriptableObjectSingleton] Removed instance of type '{typeof(T).Name}'");
}
private static void AssignInstance(T instance)
{
if (!instance) return;
_instance = instance;
Debug.Log($"[ScriptableObjectSingleton] Assigned instance of type '{typeof(T).Name}' to object '{instance.name}'", instance);
}
}
}