using UnityEngine;publicclassMonoSingleton<T>: MonoBehaviour where T: MonoBehaviour
{
privatestaticT _instance;privatestatic object _lock =newobject();privatestatic bool applicationIsQuitting =false;publicstaticT Instance
{
get
{
if(applicationIsQuitting){
Debug.LogWarning($"[Singleton] Instance '{typeof(T)}' already destroyed on application quit. Won't create again - returning null.");returnnull;}lock(_lock){
if(_instance ==null){
_instance = FindObjectOfType<T>();if(FindObjectsOfType<T>().Length >1){
Debug.LogError($"[Singleton] Something went really wrong - there should never be more than 1 singleton! Reopenning the scene might fix it.");return _instance;}if(_instance ==null){
GameObject singleton =newGameObject();
_instance = singleton.AddComponent<T>();
singleton.name ="(singleton) "+typeof(T).ToString();DontDestroyOnLoad(singleton);
Debug.Log($"[Singleton] An instance of { typeof(T) } is needed in the scene, so '{ singleton }' was created with DontDestroyOnLoad.");}else{
Debug.Log($"[Singleton] Using instance already created: {_instance.gameObject.name}");}}return _instance;}}}protected virtual voidOnDestroy(){
applicationIsQuitting =true;}public virtual voidAwake(){
if(gameObject.transform.parent ==null)DontDestroyOnLoad(gameObject);}