Unity基础教程系列(三)——复用对象(Object Pools)

目录

1 销毁对象

1.1 销毁物体的快捷键

1.2 销毁随机形状

1.3 保持列表正确

1.4 高效清除

2 持续的创造与销毁

2.1 GUI

2.2 创建速度标签

2.3 创建Speed滑动条

2.4 设置创建速度

2.5 继续形状的创建

2.6 继续形状销毁

3 对象池

3.1 分析

3.2 回收再利用

3.3 形状池

3.4 从池中检索一个对象

3.5 回收对象

3.6 用回收代替销毁

3.7 在Action里进行回收

收起

本文重点:

1、销毁形状

2、自动创建和销毁

3、构建简单的GUI

4、使用Profiler追踪内存分配

5、使用对象池回收形状

这是关于对象管理系列的第三篇教程。它增加了破坏形状的能力,以及复用它们的方法。

本教程是CatLikeCoding系列的一部分,原文地址见文章底部。“原创”标识意为原创翻译而非原创教程。

本教程使用Unity 2017.4.4f1编写。

(回收各种形状的展示)

1 销毁对象

如果我们只能创造形状,那么它们的数量只会增加,直到我们开始一个新的游戏为止。但大部分的时候,当一些物体在游戏中被创建时,它也应该可以被销毁。现在让我们让销毁形状变为可能。

1.1 销毁物体的快捷键

创建形状已经有了一个键,所以添加一个键来销毁一个形状是有意义的。为游戏添加一个key变量。虽然D似乎是一个合理的默认值,但它一般用于移动的,常见WASD键配置的一部分。这里我们用X来代替,它是一个表示取消或终止的常用符号,并且在大多数键盘上,它挨着C。

(配置创建和销毁的快捷键)

1.2 销毁随机形状

在Game中添加一个DestroyShape方法来处理一个形状的销毁。就像我们创造随机形状一样,我们也销毁随机形状。这是通过为形状列表选择一个随机索引并使用Destroy方法销毁相应的对象来完成的。

但这只在当前有形状的情况下有效。再很多时候,对象可能还没有创建或加载,或者所有现有的对象都已经被销毁了。所以我们只能在列表中包含至少一个形状时销毁它。否则,destroy命令将什么也不做。

销毁可以作用在游戏对象、组件或资产上。要删除整个shape对象而不仅仅是它的shape组件,所以我们必须明确地销毁该组件所属的游戏对象。可以通过组件的gameObject属性访问它。

既然我们的DestroyShape方法是有效的,那么当玩家按下destroy键时就可以在Update中调用它。

1.3 保持列表正确

我们现在能够创建和销毁对象。然而,当试图销毁多个形状时,你很可能会得到一个错误。

MissingReferenceException: The object of type 'Shape' has been destroyed but you are still trying to access it.

发生此错误的原因是,虽然我们已经销毁了一个形状,但没有从形状列表中删除它。因此,列表仍然包含对已销毁游戏对象组件的引用。它们仍然存在于内存中,以一种僵尸的状态。当第二次试图销毁该对象的时候,Unity会报告这个错误。

解决方法是正确地去掉对我们刚刚销毁的形状的引用。因此,在销毁一个形状之后,将其从列表中删除。这可以通过调用列表的RemoveAt方法来实现,并将要删除的元素的索引作为参数。

1.4 高效清除

虽然这种方法可以达到目的,但它不是从列表中删除元素的最有效方法。因为列表是有序的,所以删除一个元素会在列表中留下空白。从概念上讲,这种差距是很容易消除的。即让被删除元素的相邻元素成为彼此的邻居元素。

(移除D元素的示意)<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值