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

对象池的优点

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

注意事项

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

参考资料

c#中queue的用法

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