TaiZhouCangChu_VRanime/Assets/HTC.UnityPlugin/Utility/SingletonBehaviour.cs

93 lines
2.8 KiB
C#

//========= Copyright 2016-2023, HTC Corporation. All rights reserved. ===========
using System;
using UnityEngine;
namespace HTC.UnityPlugin.Utility
{
[DisallowMultipleComponent]
public abstract class SingletonBehaviour<T> : MonoBehaviour where T : SingletonBehaviour<T>
{
private static T s_instance = null;
private static bool s_isApplicationQuitting = false;
private static object s_lock = new object();
private static Func<GameObject> s_defaultInitGOGetter;
private bool m_initialized;
public static bool Active { get { return !s_isApplicationQuitting && s_instance != null; } }
public bool IsInstance { get { return this == Instance; } }
protected bool IsApplicationQuitting { get { return s_isApplicationQuitting; } }
public static T Instance
{
get
{
Initialize();
return s_instance;
}
}
public static void Initialize()
{
lock (s_lock)
{
if (s_instance != null) { return; }
if (!Application.isPlaying || s_isApplicationQuitting) { return; }
var instances = FindObjectsOfType<T>();
if (instances.Length > 0)
{
s_instance = instances[0];
if (instances.Length > 1) { Debug.LogWarning("Multiple " + typeof(T).Name + " not supported!"); }
}
if (s_instance == null)
{
GameObject defaultInitGO = null;
if (s_defaultInitGOGetter != null)
{
defaultInitGO = s_defaultInitGOGetter();
}
if (defaultInitGO == null)
{
defaultInitGO = new GameObject("[" + typeof(T).Name + "]");
}
s_instance = defaultInitGO.AddComponent<T>();
}
if (!s_instance.m_initialized)
{
s_instance.m_initialized = true;
s_instance.OnSingletonBehaviourInitialized();
}
}
}
/// <summary>
/// Must set before the instance being initialized
/// </summary>
public static void SetDefaultInitGameObjectGetter(Func<GameObject> getter) { s_defaultInitGOGetter = getter; }
protected virtual void OnSingletonBehaviourInitialized() { }
protected virtual void OnApplicationQuit()
{
s_isApplicationQuitting = true;
}
protected virtual void OnDestroy()
{
if (!s_isApplicationQuitting && s_instance == this)
{
s_instance = null;
}
}
}
}