c# singleton

using UnityEngine;  

/// <summary>  
/// Be aware this will not prevent a non singleton constructor  
///   such as `T myT = new T();`  
/// To prevent thatadd `protected T () {}` to your singleton class.  
///   
/// As a notethis is made as MonoBehaviour because we need Coroutines.  
/// </summary>  
public class Singleton<T> : MonoBehaviour where T : MonoBehaviour  
{  
    private static T _instance;  
    
    private static object _lock = new object();  
    
    public static T Instance  
    {  
        get  
        {  
            if (applicationIsQuitting) {  
                Debug.LogWarning("[Singleton] Instance '"typeof(T) +  
                                 "' already destroyed on application quit." +  
                                 " Won't create again - returning null.");  
                return null;  
            }  
            
            lock(_lock)  
            {  
                if (_instance == null)  
                {  
                    _instance = (TFindObjectOfType(typeof(T));  
                    
                    if ( FindObjectsOfType(typeof(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 = new GameObject();  
                        
                        
                        _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;  
            }  
        }  
    }  
    
    private static bool applicationIsQuitting = false;  
    /// <summary>  
    /// When Unity quitsit destroys objects in a random order.  
    /// In principlea Singleton is only destroyed when application quits.  
    /// If any script calls Instance after it have been destroyed,   
    ///   it will create a buggy ghost object that will stay on the Editor scene  
    ///   even after stopping playing the ApplicationReally bad!  
    /// Sothis was made to be sure we're not creating that buggy ghost object.  
    /// </summary>  
    public void OnDestroy () {  
        applicationIsQuitting = true;  
    }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>