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);
}
}
}