87 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C#
		
	
	
	
| using System.Collections;
 | |
| using System.Collections.Generic;
 | |
| using UnityEngine;
 | |
| 
 | |
| public class MonoSingleton<T> : MonoBehaviour where T : MonoSingleton<T>
 | |
| {
 | |
|     // [SerializeField] private bool _isLoadNotDestory = true;
 | |
| 
 | |
|     private static T instance;
 | |
|     private static object locker = new object();
 | |
| 
 | |
|   
 | |
| 
 | |
|     public static T Instance
 | |
|     {
 | |
|         get
 | |
|         {
 | |
|             if (instance == null)
 | |
|             {
 | |
|                 lock (locker)
 | |
|                 {
 | |
|                     T[] instances = FindObjectsOfType<T>();
 | |
|                     if (FindObjectsOfType<T>().Length >= 1)
 | |
|                     {
 | |
|                         instance = instances[0];
 | |
|                         for (int i = 1; i < instances.Length; i++)
 | |
|                         {
 | |
| #if UNITY_EDITOR
 | |
|                             Debug.LogError($"{typeof(T)} 不应该存在多个单例!{instances[i].name}");
 | |
| #endif
 | |
|                             Destroy(instances[i]);
 | |
|                         }
 | |
| 
 | |
|                         return instance;
 | |
|                     }
 | |
| 
 | |
|                     if (instance == null && Application.isPlaying)
 | |
|                     {
 | |
|                         var singleton = new GameObject();
 | |
|                         instance = singleton.AddComponent<T>();
 | |
|                         singleton.name = "(singleton)_" + typeof(T);
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         // DontDestroyOnLoad(instance.gameObject);
 | |
|                     }
 | |
|                 }
 | |
|                 // instance.hideFlags = HideFlags.None;
 | |
|             }
 | |
| 
 | |
|             return instance;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     // public static bool IsInitialized
 | |
|     // {
 | |
|     //     get
 | |
|     //     {
 | |
|     //         return instance != null;
 | |
|     //     }
 | |
|     // }
 | |
| 
 | |
|     protected virtual void Awake()
 | |
|     {
 | |
|         // if (_isLoadNotDestory)
 | |
|         // {
 | |
|         //     DontDestroyOnLoad(this);
 | |
|         // }
 | |
|         // if (instance != null)
 | |
|         // {
 | |
|         //     Debug.LogErrorFormat("Trying to instantiate a second instance of singleton class {0}", GetType().Name);
 | |
|         // }
 | |
|         // else
 | |
|         // {
 | |
|         //     instance = (T)this;
 | |
|         // }
 | |
|     }
 | |
| 
 | |
|     // public virtual void OnDestroy()
 | |
|     // {
 | |
|     //     if (instance == this)
 | |
|     //     {
 | |
|     //         instance = null;
 | |
|     //     }
 | |
|     // }
 | |
| }
 |