Unity 2019中对象池的用法

发布时间 2023-05-05 22:19:14作者: 阿土仔

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中,我们并不需要实现对象的创建或销毁等处理。对象池自动处理创建和销毁的逻辑,并通过工厂方法减少复杂的编码需求。