Unity 《Mini Metro》模擬 ——“線”池
阿新 • • 發佈:2020-08-09
“線”池
利用佇列建立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; } }