美文网首页
在Unity3D中使用单例模式

在Unity3D中使用单例模式

作者: 啊昕7777 | 来源:发表于2019-04-11 21:00 被阅读0次

    # 起因

    通过构造函数的方式实现单例模式在Unity3D中存在问题,因每当挂载的组件被调用时,构造函数会被反复调用。

    # 方法

    第一步:创建工具类 Singleton

    using UnityEngine;

    /// <summary>

    /// Inherit from this base class to create a singleton.

    /// e.g. public class MyClassName : Singleton<MyClassName> {}

    /// </summary>

    public class Singleton<T> : MonoBehaviour where T : MonoBehaviour

    {

        // Check to see if we're about to be destroyed.

        private static bool m_ShuttingDown = false;

        private static object m_Lock = new object();

        private static T m_Instance;

        /// <summary>

        /// Access singleton instance through this propriety.

        /// </summary>

        public static T Instance

        {

            get

            {

                if (m_ShuttingDown)

                {

                    Debug.LogWarning("[Singleton] Instance '" + typeof(T) +

                        "' already destroyed. Returning null.");

                    return null;

                }

                lock (m_Lock)

                {

                    if (m_Instance == null)

                    {

                        // Search for existing instance.

                        m_Instance = (T)FindObjectOfType(typeof(T));

                        // Create new instance if one doesn't already exist.

                        if (m_Instance == null)

                        {

                            // Need to create a new GameObject to attach the singleton to.

                            var singletonObject = new GameObject();

                            m_Instance = singletonObject.AddComponent<T>();

                            singletonObject.name = typeof(T).ToString() + " (Singleton)";

                            // Make instance persistent.

                            DontDestroyOnLoad(singletonObject);

                        }

                    }

                    return m_Instance;

                }

            }

        }

        private void OnApplicationQuit()

        {

            m_ShuttingDown = true;

        }

        private void OnDestroy()

        {

            m_ShuttingDown = true;

        }

    }

    第二步:调整单例类

    public class MagicWallManager : Singleton<MagicWallManager>

    {

        //

        //  Single

        //

        protected MagicWallManager() { }

        void Awake(){

        … 初始化内容

        }

        。。。

    }

    使用方式

    MagicWallManager.Instance

    # REF

    http://wiki.unity3d.com/index.php/Singleton

    相关文章

      网友评论

          本文标题:在Unity3D中使用单例模式

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