Unity 《Mini Metro》模拟 ——“线”池

回收池

利用队列建立对象的线池。

当需要实例化GameObject的时候,如果不能从线池中取出实例,就Instantiate出一个。

例如子弹射击,完成射击动作的子弹,会被回收到队列,而不是Destroy,在需要子弹的时候再从队列中取出。避免频繁地Instantiate和Destroy。

    public class QueuePool<T> where T : MonoBehaviour
    {
        //构造函数传入prefab
        public QueuePool(GameObject p)
        {
            queue = new Queue<T>();
            prefab = p;
        }
        
        private readonly Queue<T> queue;
        private static GameObject _poolRoot;
        private readonly GameObject prefab;
        /// <summary>
        /// 获取对象:队列为空就Instantiate,否则出列
        /// </summary>
        /// <returns>对象</returns>
        public T GetLine()
        {
            T t;
            if (queue.Count == 0)
            {
                GameObject go = Object.Instantiate(prefab);
                go.name = go.name + Random.Range(0,1000);
                t= go.GetComponent<T>();
            }
            else
            {
                t = queue.Dequeue();
                t.gameObject.SetActive(true);
                t.transform.parent = null;
            }

            return t;
        }

        /// <summary>
        /// 将线加入到队列中,并统一设置transform
        /// </summary>
        /// <param name="t">回收的对象</param>
        public void ResetLine(T t)
        {
            if (_poolRoot == null)
            {
                _poolRoot = new GameObject("PoolRoot");
            }
            queue.Enqueue(t);
            t.gameObject.SetActive(false);
            t.transform.parent = _poolRoot.transform;
        }
    }
posted @ 2020-08-09 13:54  他们讨厌我  阅读(195)  评论(0)    收藏  举报