惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
V
Visual Studio Blog
Last Week in AI
Last Week in AI
Stack Overflow Blog
Stack Overflow Blog
The GitHub Blog
The GitHub Blog
Recent Announcements
Recent Announcements
博客园 - Franky
D
DataBreaches.Net
B
Blog
Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
Microsoft Azure Blog
Microsoft Azure Blog
人人都是产品经理
人人都是产品经理
WordPress大学
WordPress大学
P
Proofpoint News Feed
J
Java Code Geeks
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Martin Fowler
Martin Fowler
月光博客
月光博客
宝玉的分享
宝玉的分享
Engineering at Meta
Engineering at Meta
阮一峰的网络日志
阮一峰的网络日志
F
Fortinet All Blogs
博客园 - 【当耐特】

博客园 - 阿土仔

Unity UGUI动态生成控件 Unity场景间数据传递方法 UGUI防止穿透和判断点击的是否是UI Unity中的Character Controller Unity插件研究-EasyTouch V5 Unity塔防游戏的创建 Unity性能优化-DrawCall Unity性能优化-对象池 Unity性能优化-音频设置 Unity性能优化-遮挡剔除 Unity异步加载场景 Unity 协程 HBuilder git使用-分工合作 HBuilder git合作-代码同步 微信小程序开发-窗体设置 HBuilder git合作-从Git Hub Clone项目 HBuilder git合作-上传项目到Git Hub 微信小程序开发-tabbar组件 HBuilder git使用-建立仓库,邀请用户
Unity 2019中对象池的用法
阿土仔 · 2023-05-05 · via 博客园 - 阿土仔

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