【unity2D】利用C#队列Queue实现对象池
目标
利用C#队列Queue实现对象池。(用泛型集合List也能实现)
队列Queue的特点
- 先进先出,后进后出。
- 队列没有实现 IList,ICollection。所以它不能按索引访问元素,不能使用Add和Remove。
队列Queue的常用方法
方法 | 解释 |
---|---|
Enqueue() | 在队列的末端添加元素 |
Dequeue() | 在队列的头部读取一个元素并删除 |
Peek() | 在队列的头读取一个元素,但是不删除它 |
CopyTo() | 把队列中的元素复制到一个已有的数组中 |
ToArray() | 返回一个包含该队列元素的新数组 |
下面利用Enqueue入队和Dequeue出队来实现对象池。
代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Pool : MonoBehaviour
{
public GameObject objectPrefab;
public int objectCount = 20;
Queue<GameObject> avaiObjects = new Queue<GameObject>();//创建队列
private void Awake()
{
//初始化对象池
FillPool();
}
//填充对象池
public void FillPool()
{
int _i;
for(_i = 0;_i < objectCount ;_i++)
{
var new_object = Instantiate(objectPrefab);
new_object.transform.SetParent(transform);
BackToPool(new_object);
}
}
//入池
public void BackToPool(GameObject _object)
{
//取消激活以返回对象池
_object.SetActive(false);
avaiObjects.Enqueue(_object);
}
//出池
public GameObject UseObjectsInPool()
{
if(avaiObjects.Count == 0)
{
FillPool();
}
var object_in_use = avaiObjects.Dequeue();
object_in_use.SetActive(true);
return object_in_use;
}
}
对象池的优点
复用池中对象,以减少分配内存、释放内存、创建堆中对象和销毁堆中对象的开销。
注意事项
因为对象池最大的特点就是复用对象,所以,当对象被放回池子里的时候,要还原各类字段,以确保对象中不含上次使用后遗留的脏字段。