83 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C#
		
	
	
	
| namespace SRF.Components
 | |
| {
 | |
|     using System;
 | |
|     using System.Diagnostics;
 | |
|     using UnityEngine;
 | |
|     using Debug = UnityEngine.Debug;
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Inherit from this component to easily create a singleton gameobject.
 | |
|     /// </summary>
 | |
|     /// <typeparam name="T"></typeparam>
 | |
|     public abstract class SRSingleton<T> : SRMonoBehaviour where T : SRSingleton<T>
 | |
|     {
 | |
|         private static T _instance;
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Get the instance of this singleton.
 | |
|         /// </summary
 | |
|         public static T Instance
 | |
|         {
 | |
|             [DebuggerStepThrough]
 | |
|             get
 | |
|             {
 | |
|                 // Instance requiered for the first time, we look for it
 | |
|                 if (_instance == null)
 | |
|                 {
 | |
|                     throw new InvalidOperationException("No instance of {0} present in scene".Fmt(typeof (T).Name));
 | |
|                 }
 | |
|                 return _instance;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public static bool HasInstance
 | |
|         {
 | |
|             [DebuggerStepThrough] get { return _instance != null; }
 | |
|         }
 | |
| 
 | |
|         private void Register()
 | |
|         {
 | |
|             if (_instance != null)
 | |
|             {
 | |
|                 Debug.LogWarning("More than one singleton object of type {0} exists.".Fmt(typeof (T).Name));
 | |
| 
 | |
|                 // Check if gameobject only contains Transform and this component
 | |
|                 if (GetComponents<Component>().Length == 2)
 | |
|                 {
 | |
|                     Destroy(gameObject);
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     Destroy(this);
 | |
|                 }
 | |
| 
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             _instance = (T) this;
 | |
|         }
 | |
| 
 | |
|         // If no other monobehaviour request the instance in an awake function
 | |
|         // executing before this one, no need to search the object.
 | |
|         protected virtual void Awake()
 | |
|         {
 | |
|             Register();
 | |
|         }
 | |
| 
 | |
|         protected virtual void OnEnable()
 | |
|         {
 | |
|             // In case of code-reload, this should restore the single instance
 | |
|             if (_instance == null)
 | |
|             {
 | |
|                 Register();
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         // Make sure the instance isn't referenced anymore when the user quit, just in case.
 | |
|         private void OnApplicationQuit()
 | |
|         {
 | |
|             _instance = null;
 | |
|         }
 | |
|     }
 | |
| }
 |