美文网首页
MonoBehaviour单例

MonoBehaviour单例

作者: 晓龙酱 | 来源:发表于2017-10-01 21:36 被阅读8次

与上一篇单例的设计相同,只是需要生成GameObject然后把脚本挂上去。

public class SingletonMonoBehaviour<T> : MonoBehaviour where T : SingletonMonoBehaviour<T>
{
     private static T m_instance;
     private static readonly object m_lock = new object();
     public static bool m_appExit;


     virtual protected void Awake()
     {
         if(m_instance == null)
            m_instance = (T)this;

        GameObject.DontDestroyOnLoad(gameObject);

        Debug.Assert(m_instance == this, string.Format("{0} is duplicated! It is a singleton!", typeof(T).Name));
     }
     

     public static T Instance
     {
         get{
             if(m_appExit)
                return null;

             if(m_instance != null)
                return m_instance;
            
            lock(m_lock)
            {
                if(m_instance != null)
                    return m_instance;
                
                m_instance = SingletonGameobject.Instance.GetComponent<T> ();
                if(m_instance == null)
                {                   
                    m_instance = SingletonGameobject.Instance.AddComponent<T>();                                
                }
            }

            return m_instance;
         }
     }

     private void OnDestroy()
     {
         m_appExit = true;

         #if UNITY_EDITOR
         Debug.LogWarning(string.Format("SingletonMonobehaviour destroyed, {0}", typeof(T).Name));
         #endif
     }   
}
public class SingletonMonoBehaviour<T, I> : MonoBehaviour where T : SingletonMonoBehaviour<T, I>, I
{

    private static I m_instance;
    private static readonly object m_lock = new object();
    public static bool m_appExit;


    virtual protected void Awake()
    {
        if (m_instance == null)
            m_instance = (I)((T)this);

        GameObject.DontDestroyOnLoad(gameObject);

        Debug.Assert((T)m_instance == ((T)this), string.Format("{0} is duplicated! It is a singleton!", typeof(T).Name));
    }


    public static I Instance
    {
        get{
            if (m_appExit)
                return default(I);

            if(m_instance != null)
                return m_instance;

            lock(m_lock)
            {
                if(m_instance != null)
                    return m_instance;

                m_instance = (I)(SingletonGameobject.Instance.GetComponent<T>());
                if(m_instance == null)
                {
                    m_instance = SingletonGameobject.Instance.AddComponent<T>();
                }
            }

            return m_instance;
        }
    }

    private static void GetSingletonGO()
    {

    }

    private void OnDestroy()
    {
        m_appExit = true;

        #if UNITY_EDITOR
        Debug.LogWarning(string.Format("SingletonMonobehaviour destroyed, {0}", typeof(T).Name));
        #endif
    }

}
class SingletonGameobject
{

    private static GameObject m_instance;
    private static readonly object m_lock = new object();


    public static GameObject Instance
    {
        get{
            
            if(m_instance != null)
                return m_instance;

            lock(m_lock)
            {
                if(m_instance != null)
                    return m_instance;

                if(m_instance == null)
                {
                    m_instance = new GameObject("SingletonGO");
                    GameObject.DontDestroyOnLoad(m_instance);           
                }
            }

            return m_instance;
        }
    }       
}

相关文章

网友评论

      本文标题:MonoBehaviour单例

      本文链接:https://www.haomeiwen.com/subject/vygaextx.html