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;
}
}