作者KuLanDot (库兰达克斯)
看板GameDesign
标题[程式] Unity 2021 新物件池类别
时间Fri May 20 23:10:19 2022
在 Unity 2021 版中,新增了一系列的物件池类别
使用起来相当方便,而且概念也很棒
所以就做了一集来介绍这个物件池类别
https://www.youtube.com/watch?v=5Z7CG9seVfA
这个物件池类别 ObjectPool 就像 List 或 Stack 一样
是一个资料类别,所以直接建立它的物件就可以使用
常用的建构子参数如下:
ObjectPool<
T>( <- T:对象类别
Func<
T> createFunc, <- 要建立新物件时的函式
Action<
T> actionOnGet, <- 要取出物件前,呼叫的函式
Action<
T> actionOnRelease, <- 要归还物件前,呼叫的函式
Action<
T> actionOnDestroy) <- 物件池满了,要呼叫的函式
举例来说,如果要管理一个 Ball 类别的生成,就会像这样:
var ballPool =
new ObjectPool<
Ball>(
CreateBall,
OnGetBall,
OnReleaseBall,
OnDestroyBall);
-
Ball CreateBall():就从 prefab 建立一个新的球
-
void OnGetBall(
Ball ball):启动即将要取出的球物件
-
void OnReleaseBall(
Ball ball):关闭要归还回来的球物件
-
void OnDestroy(
Ball ball):直接摧毁这个球物件
要从物件池取出物件就用 Get() 函式:
var ball = ballPool.
Get();
要归还物件就用 Release() 函式:
ballPool.
Release(ball);
这个物件池类别也可以用来管理一般的类别,不一定要继承 MonoBehaviour
另外它也可以使用在 using statement 之下:
using (somePool.
Get(
out data)) {
data =
GenerateData();
SendData(data);
}
在离开 using statement 之後,data 就会自己呼叫 Release 归还回去了
我很喜欢 ObjectPool 类别用 callback 来增加泛用性的概念
在专案中很常用在图监的地方,用来动态生成图监列表的物件
推荐给大家
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 182.234.108.58 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/GameDesign/M.1653059421.A.872.html
1F:推 livelyO2: 推 05/21 00:00
2F:推 newyellow: 感谢分享 第一次听说这个类别 xd 05/23 05:32
3F:推 iLeyaSin365: Money createmoney() 05/24 17:12