// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See LICENSE in the project root for license information. using System; using UnityEngine; namespace XRTool.Util { /// /// Unity的单例 /// Singleton behaviour class, used for components that should only have one instance /// /// /// public abstract class UnitySingleton : MonoBehaviour where T : UnitySingleton { public static event Action InitComplte; public static event Action DeleteSingle; private static T instance; public static T Instance { get { try { return instance; } catch { return null; } } } /// /// Returns whether the instance has been initialized or not. /// public static bool IsInitialized { get { return instance != null; } } /// /// 强制实例化某对象 /// 注意,尽量避免在多处使用或者在awake中使用,避免产生多个实例化多项 /// public static T ForceInstance() { if (!instance) { GameObject obj = new GameObject(); instance= obj.AddComponent(); } return instance; } /// /// Base awake method that sets the singleton's unique instance. /// protected virtual void Awake() { if (instance != null && instance.gameObject != gameObject) { Debug.LogErrorFormat("{0}为单例对象,但是场景中存在多个{0},已删除本对象", GetType().Name); Destroy(gameObject); } else { DeleteSingle = null; instance = (T)this; InitComplte?.Invoke(); } } /// /// 对象被销毁时的事件传递 /// protected virtual void OnDestroy() { if (instance == this) { instance = null; DeleteSingle?.Invoke(); } InitComplte = null; } } }