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

posted @   阿土仔  阅读(192)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示