当前位置:   article > 正文

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元素的示意)

但是,List类是用数组实现的,因此不能直接操作邻居关系。相反,间隙是通过将下一个元素移到这个间隙中来消除的,因此它直接出现在被删除的元素之前的元素之后。这会将间隙向列表的末尾移动了一步。需要重复这个过程,直到间隙从列表末尾消失。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/332976
推荐阅读
相关标签
  

闽ICP备14008679号