在Unity所提供的API中,为开发者提供了一些基本的内置对象池类,可以自动化地实例化重复对象和回收对象,而开发者只需要简单搭建一些框架,就可以轻松使用它。
下面我将介绍一种我常用的Unity内置对象池。
一、引入Unity对象池命名空间
using UnityEngine.Pool;
二、定义对象池对象和预制体对象
//创建一个对象池对象
private ObjectPool<GameObject> pool;
/*
预制体对象
也就是你要重复生成的对象
*/
public GameObject prefab;
三、构造对象并填入方法
在构造对象的时候,我们需要传入七个参数,其中前四个要填写方法,后三个为值参数。我们不用管它的内部是怎么运行的,Unity官方所提供的技术会为我们打理好对象池的运行,我们只需要会使用它就行了。
/*后三个函数解释:启用安全检查为true,默认池容量10,最大池容量1000*/
pool = new ObjectPool<GameObject>(createFunc,actionOnGet,actionOnRelease,actionOnDestroy,true,10,1000);
//以下四个函数照着写就行
/*createFunc:用于在池为空的时候创建新实例*/
GameObject createFunc()
{
var obj = Instantiate(prefab,transform);
return obj;
}
/*actionOnGet:从池中获取实例时调用*/
void actionOnGet(GameObject obj)
{
obj.gameObject.SetActive(true);
}
/*
actionOnRelease:在实例返回到池时调用,可以用于清理或者禁用实例*/
void actionOnRelease(GameObject obj)
{
obj.gameObject.SetActive(false);
}
/*actionOnDestroy:操作销毁。当元素由于池达到最大大小而无法返回到池时调用*/
void actionOnDestroy(GameObject obj)
{
Destroy(obj);
}
四、取出对象和释放对象
当我们使用了对象池技术之后,就要使用ObjectPool自带的方法来取出对象和释放对象
/*
主要用到两个方法,一个是Get(),另一个是Release()
基于这两个方法,自由发挥即可
*/
//生成对象
private void GenerateObj()
{
/*
游戏对象的获取。Get方法为ObjectPool类的内置方法,
类似于Instantiate()
*/
GameObject obj = pool.Get();
//...
}
/*
销毁对象
实际上并没有被销毁,只不过是被禁用了而已(就是SetActive(false))
*/
private void DestroyObj(GameObject obj)
{
pool.Release(obj)
}
这里只是一个代码层面的使用讲解,需要结合你的项目的实际情况进行调整优化,切勿生搬硬套,请自由发挥!