版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq992817263/article/details/86610600
ObjectPool模块简介
ObjectPool是专用于GameObject类型的对象池,可以复用任意GameObject对象,以达到减少系统在频繁创建和删除对象时的开销。
使用ObjectPool
注册对象池
GameObject类型的对象需要提供一个模板注册到对象池,该模板可以为Scene中的对象或Project中的预制体,只能动态注册,注册到对象池之后便可以直接从对象池中提取对象。
//Monster 对象模板
public GameObject MonsterTem;
private void Start ()
{
//注册 Monster 对象池
Main.m_ObjectPool.RegisterSpawnPool("Monster", MonsterTem,
(monster) =>
{
//对象池的生成初始化,当一个怪物生成时,位置初始化为(0,0,0)
monster.transform.localPosition = Vector3.zero;
},
(monster) =>
{
//对象池的回收初始化,当一个怪物回收时,位置初始化为(1000,1000,1000)
monster.transform.localPosition = new Vector3(1000, 1000, 1000);
});
}
生成对象
对象池在注册时可以指定对象的生成时回调,和回收时回调,用于在对象生成、回收时做一些初始化操作。
注册对象池之后,提取一个新的对象很简单,只需要通过注册名称提取就可以了:
//提取一个崭新的 Monster 对象
GameObject monster = Main.m_ObjectPool.Spawn("Monster");
回收对象
当对象不再使用时,回收对象也很简单:
//回收一个 Monster 对象
Main.m_ObjectPool.Despawn("Monster", monster);
设置对象池上限
选中主预制体下的ObjectPool对象,在ObjectPoolManager的属性面板,Limit为限制对象池中单个队列的上限,对象池中的对象超过此数值时将不再回收对象。
取消注册对象池
需要注意的是,对象池以string类型的名称来区分,所以这里的名称绝对不能重复,也不能传错。
取消一个已注册的无用对象池:(注意该操作会彻底删除对象池中所有对象)
//取消一个已注册的对象池,
Main.m_ObjectPool.UnRegisterSpawnPool("Monster");
销毁对象池
销毁所有对象池以及其中包含的对象:
Main.m_ObjectPool.Clear();