欢迎加入光光的奇妙冒险,我是你们的煎饼光子老师。
上期说完自定义的对象池之后,这期我们来介绍Unity中自带的对象池
是的,Unity也是有自己的对象池
(如果想要直接获取代码的话,可以直接免费下载在文章上方的相关资源)
使用的话,要先引用命名空间UnityEngine.Pool
引用了就可以使用Unity自带的各种类型的对象池了
这次我们使用的是Object类型的,普适性强一点
先介绍下相关的API,中文翻译解释已经很详尽了,红字是我对于一些难理解部分的补充解释
大家看完这些API后,其实也不难发现,与我们上期自己制作的自定义对象池大差不差,只是加了一些细节内容,像是获取池中使用和未使用对象的数量这些
接下来,进入实战,把代码端上来
对象池:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Pool;//一定要引用对象池的命名空间
public class PoolSelf : MonoBehaviour
{
public int sumCount;//对象总数
public int activeCount;//已使用对象
public int inactiveCount;//未使用对象
public GameObject objPrefab;//对象
public ObjectPool<GameObject> pool;//对象池
private void Awake()
{
pool = new ObjectPool<GameObject>(
createFunc: () => { GameObject obj=Instantiate(objPrefab, transform);
obj.GetComponent<DelayDestroy>().pool = pool;
return obj;
},
actionOnGet: (obj) => obj.SetActive(true),
actionOnRelease: (obj) => obj.SetActive(false),
actionOnDestroy: (obj) => Destroy(obj),
true, 10, 1000);
}
private void Update()
{
sumCount = pool.CountAll;
activeCount = pool.CountActive;
inactiveCount=pool.CountInactive;
if(Input.GetMouseButtonDown(0))
{
pool.Get();
}
}
}
与上期一样,也要为生成的对象挂载一个脚本(所以强烈推荐大家去看我的那篇自定义对象池的文章)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Pool;//一定要引用对象池的命名空间
public class DelayDestroy : MonoBehaviour
{
public ObjectPool<GameObject> pool;
private void OnEnable()
{
transform.position=new Vector3(Random.Range(0,5), Random.Range(0, 5), Random.Range(0, 5));
Invoke("DestroySelf", 1);
}
private void DestroySelf()
{
pool.Release(gameObject);
}
}
OK,Unity自带的对象池就是这样,大家可以写一个测试脚本简单测试下