Unity 2019中对象池的用法
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ExamplePool : MonoBehaviour
{
private ObjectPool<GameObject> objectPool;
public GameObject objectType;
public int poolSize = 10;
void Start()
{
objectPool = new ObjectPool<GameObject>(() =>
{
GameObject obj = Instantiate(objectType);
obj.SetActive(false);
return obj;
}, poolSize);
}
void Update()
{
GameObject obj = objectPool.Get();
obj.SetActive(true);
obj.transform.position = new Vector3(Random.Range(-5f, 5f), 1f, Random.Range(-5f, 5f));
StartCoroutine(ReleaseObjectAfterDuration(obj, 1f));
}
private IEnumerator ReleaseObjectAfterDuration(GameObject obj, float delay)
{
yield return new WaitForSeconds(delay);
objectPool.Release(obj);
}
}
在此示例中,我们创建了一个可以管理GameObject
对象池的ObjectPool<GameObject>
实例。我们使用了Unity 2019提供的新泛型对象池API:new ObjectPool<T>(Func<T> factoryMethod, int initialCapacity)
。在函数中,我们传递了一个工厂方法,用于在添加至池中前实例化一个新对象。
在Start()
方法中,我们实例化了一个GameObject
类型对象池,初始化完成后,我们可以随时使用Get()
和Release()
方法。当需要一个实例时,我们可以使用Get()
方法返回一个可用的对象实例并将其设置为已激活状态。当我们使用完对象时,需要将其释放到对象池中,这时我们使用Release()
方法来将其放回对象池。
值得一提的是,在Unity中自带的泛型对象池API中,我们并不需要实现对象的创建或销毁等处理。对象池自动处理创建和销毁的逻辑,并通过工厂方法减少复杂的编码需求。