赞
踩
目录 |
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元素的示意)
但是,List类是用数组实现的,因此不能直接操作邻居关系。相反,间隙是通过将下一个元素移到这个间隙中来消除的,因此它直接出现在被删除的元素之前的元素之后。这会将间隙向列表的末尾移动了一步。需要重复这个过程,直到间隙从列表末尾消失。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。