1. 程式人生 > 實用技巧 >Unity 《Mini Metro》模擬 ——“線”池

Unity 《Mini Metro》模擬 ——“線”池

“線”池

利用佇列建立DrawLineTools的線池。

當需要繪製線的時候,如果不能從線池中取出DrawLineTools,就Instantiate出一個。

    public class Line
    {
        private static readonly LinePool LinePool = new LinePool(Resources.Load<GameObject>("Prefabs/Line"));
        private static readonly LinePool EndLinePool = new LinePool(Resources.Load<GameObject>("Prefabs/End"));

        // private static LineManager _singleton;
        
        /// <summary>
        /// 建立DrawMeshTools
        /// </summary>
        /// <returns></returns>
        public static DrawLineTools CreateLine()
        {
            return LinePool.GetLine();
        }

        /// <summary>
        /// 連線終點
        /// </summary>
        /// <param name="node">結點</param>
        public static DrawLineTools CreateEnd(TrackNode node)
        {
            DrawLineTools mesh = EndLinePool.GetLine();;
            mesh.LastNode = node;
            return mesh;
        }
        
        /// <summary>
        /// 將臨時線回收
        /// </summary>
        /// <param name="line">待回收的DrawLineTools</param>
        public static void ResetLine(DrawLineTools line)
        {
            LinePool.ResetLine(line);
        }
    } 
    
    public class LinePool
    {
        public LinePool(GameObject p)
        {
            lines = new Queue<DrawLineTools>();
            prefab = p;
        }
        
        private Queue<DrawLineTools> lines;
        private GameObject poolRoot;
        private GameObject prefab;
        
        public DrawLineTools GetLine()
        {
            DrawLineTools line;
            if (lines.Count == 0)
            {
                GameObject go = GameObject.Instantiate(prefab);
                line = go.GetComponent<DrawLineTools>();
            }
            else
            {
                line = lines.Dequeue();
                line.gameObject.SetActive(true);
                line.transform.parent = null;
            }

            return line;
        }

        public void ResetLine(DrawLineTools line)
        {
            if (poolRoot == null)
            {
                poolRoot = new GameObject("PoolRoot");
            }
            lines.Enqueue(line);
            line.gameObject.SetActive(false);
            line.transform.parent = poolRoot.transform;
        }
    }