【unity2D】利用C#队列Queue实现对象池

目标

利用C#队列Queue实现对象池。(用泛型集合List也能实现)

队列Queue的特点

  1. 先进先出,后进后出。
  2. 队列没有实现 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 avaiObjects = new Queue();//创建队列

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

对象池的优点

复用池中对象,以减少分配内存、释放内存、创建堆中对象和销毁堆中对象的开销。

注意事项

因为对象池最大的特点就是复用对象,所以,当对象被放回池子里的时候,要还原各类字段,以确保对象中不含上次使用后遗留的脏字段。

参考资料

c#中queue的用法

posted @ 2021-05-14 16:02  AshScops  阅读(1142)  评论(0)    收藏  举报