using System; using Unity.XR.CoreUtils.Collections; namespace UnityEngine.XR.Interaction.Toolkit.Utilities { /// /// Manager singleton for objects to help ensure they are disposed at the end of the application's life. /// [AddComponentMenu("")] // Hide in menu [HelpURL(XRHelpURLConstants.k_DisposableManagerSingleton)] sealed class DisposableManagerSingleton : MonoBehaviour { static DisposableManagerSingleton instance => Initialize(); static DisposableManagerSingleton s_DisposableManagerSingleton; readonly HashSetList m_Disposables = new HashSetList(); static DisposableManagerSingleton Initialize() { if (s_DisposableManagerSingleton == null) { var singleton = new GameObject("[DisposableManagerSingleton]"); DontDestroyOnLoad(singleton); s_DisposableManagerSingleton = singleton.AddComponent(); } return s_DisposableManagerSingleton; } void Awake() { if (s_DisposableManagerSingleton != null && s_DisposableManagerSingleton != this) { Destroy(this); return; } if (s_DisposableManagerSingleton == null) { s_DisposableManagerSingleton = this; } } void OnDestroy() { DisposeAll(); } void OnApplicationQuit() { DisposeAll(); } void DisposeAll() { var disposableList = m_Disposables.AsList(); for (var i = 0; i < disposableList.Count; ++i) { disposableList[i].Dispose(); } m_Disposables.Clear(); } /// /// Register disposable to auto dispose on Destroy or application quit. /// /// Disposable to auto-dispose when application quits. public static void RegisterDisposable(IDisposable disposableToRegister) { instance.m_Disposables.Add(disposableToRegister); } } }