1 line
2.6 KiB
C#
1 line
2.6 KiB
C#
using UnityEngine;
|
||
|
||
namespace PhxhSDK
|
||
{
|
||
public class SingletonMono<T> : MonoBehaviour where T : MonoBehaviour
|
||
{
|
||
// Check to see if we're about to be destroyed.
|
||
private static bool m_ShuttingDown;
|
||
private static readonly object m_Lock = new();
|
||
private static T m_Instance;
|
||
|
||
/// <summary>
|
||
/// Access singleton instance through this propriety.
|
||
/// </summary>
|
||
public static T Instance
|
||
{
|
||
get
|
||
{
|
||
if (!Application.isPlaying)
|
||
{
|
||
Debug.LogError("[Singleton] Instance '" + typeof(T) + "' not found. (非运行状态下调用Instance)");
|
||
return null;
|
||
}
|
||
#if UNITY_EDITOR
|
||
if (m_ShuttingDown)
|
||
{
|
||
DebugUtil.LogWarning("[Singleton] Instance '" + typeof(T) + "' already destroyed. Returning null.");
|
||
return null;
|
||
}
|
||
#endif
|
||
lock (m_Lock)
|
||
{
|
||
if (m_Instance == null)
|
||
{
|
||
// Search for existing instance.
|
||
m_Instance = (T)FindObjectOfType(typeof(T));
|
||
|
||
// Create new instance if one doesn't already exist.
|
||
if (m_Instance == null)
|
||
{
|
||
// Need to create a new GameObject to attach the singleton to.
|
||
var singletonObject = new GameObject();
|
||
m_Instance = singletonObject.AddComponent<T>();
|
||
singletonObject.name = typeof(T) + " (Singleton)";
|
||
singletonObject.hideFlags = HideFlags.HideInHierarchy;
|
||
// Make instance persistent.
|
||
if (Application.isPlaying)
|
||
{
|
||
// 有人在非运行状态下调用Instance,不要设置DontDestroyOnLoad
|
||
DontDestroyOnLoad(singletonObject);
|
||
}
|
||
(m_Instance as SingletonMono<T>)?.InitImmediately();
|
||
}
|
||
}
|
||
|
||
return m_Instance;
|
||
}
|
||
}
|
||
}
|
||
|
||
private void OnApplicationQuit()
|
||
{
|
||
m_ShuttingDown = true;
|
||
}
|
||
|
||
// 这个方法如果override,会在Instance创建完立刻调用, 派生类可以用来默认初始化一些东西
|
||
protected virtual void InitImmediately()
|
||
{
|
||
}
|
||
}
|
||
} |