目录 |
1 形状旋转 1.1 添加旋转 1.2 随机旋转 1.3 保存角速度 1.4 一次性更新所有形状 2 形状运动 2.1 增加速度 2.2 保存速度 2.3 随机化速度 2.4 逐个生成区域的速度 2.5 相对速度 3 逐个生成区域的配置 3.1 移动方向 3.2 向外运动 3.3 随机运动 3.4 速度范围 3.5 隔离配置 3.6 重写符合区域 4 高级配置 4.1 角速度和缩放 4.2 Custom Property Drawer 4.3 配置颜色 4.4 范围滑动条 4.5 滑块值 |
本文重点:
1、让形状旋转和移动
2、集中控制游戏Update
3、每个生成区域可配置化
4、提高检视面板便捷度
这是有关 对象管理 的系列教程中的第七篇。它为形状增加了一些行为,并可以针对每个生成区域配置它们。
本教程是CatLikeCoding系列的一部分,原文地址见文章底部。原创标识仅表示原创翻译。如果因此导致其他人翻译不便之处可以联系本人开白,不显示来源。
本教程使用Unity 2017.4.12f1制作。
(每个生成区域都在做自己的事情)
1 形状旋转
我们可以创造出外观各异的形状,但它们只是原地不动,直到被销毁。现在让他们做点事情来增添趣味性。比如,让所有的形状旋转起来。
1.1 添加旋转
使对象旋转的最直接方法是调用其Transform组件的Rotate方法,就像我们对RotatingObject所做的那样。这个时候,我们需要向Shape添加一个FixedUpdate方法并调用它。首先先使用对象的本地的 forward 方向作为其旋转轴。
(旋转形状)
默认的时间步长是0.02,这意味着FixedUpdate每秒被调用50次。因此,我们最终得到了每秒旋转50°的形状。但是,通过将forward 矢量乘以50,再乘以时间增量,可以使转速明确。并且这会让旋转与时间步长无关。
1.2 随机旋转
下一步是给每个形状一个随机的角速度。添加一个公共AngularVelocity属性,使其可以进行配置,然后使用该属性来确定每次Update的旋转程度。
现在,游戏必须在CreateShape中设置形状的角速度。我们可以使用Random.onUnitSphere获取随机旋转轴。将其乘以50,所以我们再次以每秒50°的旋转结束。
(随机角速度)
为了使旋转速度也随机化,请将50替换为随机范围,例如每秒0到90度之间。
1.3 保存角速度
此时,我们还没有保存角速度。加载游戏还是会得到具有任意角速度的形状,因为回收的形状会保持其原有速度。因为保存角速度需要更改文件格式,所以请将保存版本增加到4。
在形状的颜色之后写下角速度。
保存的版本足够高时,还要加载时读取角速度。保存较早的游戏因为没有角速度,请使用零向量。
1.4 一次性更新所有形状
在添加形状旋转功能之前,我们不需要更新形状。但是现在,Unity必须调用所有活动形状的FixedUpdate方法。虽然常规方法调用并不会造成实际问题,但是FixedUpdate和其他特殊的Unity方法需要额外的开销,这可能会使对象变慢。当只有几个活动形状时,这不是问题,但是在处理许多形状时可能会成为性能瓶颈。
(Profiler 展示1000个独立的FixedUpdate调用)
与其将形状更新的责任留给Unity,不如我们自己进行管理。游戏已经包含所有活动形状的列表,正好可以用来更新它们。但是我们不能使用FixedUpdate,因为不管如何,Unity都会调用同名方法,所以必须将其重命名为其他名称。这里我们修改为GameUpdate,并将其公开,以便Game可以访问它。
在Game的FixedUpdate方法中,遍历形状列表并调用每个形状的新GameUpdate。在生成新形状之前,一开始就执行此操作。这样可以使行为与我们游戏的早期版本保持一致。
(所有的Update都统一起来了)
这种优化真的值得吗?
当你处理成千上万个相似的对象时,它们都需要更新,而你自己也已经对其进行了跟踪,那么这样做是值得的。你需要去了解性能会消耗多少,因为它随目标平台的不同而不同。优化在编辑器下可以获得最大收益。请注意,如果你发现自己正处于这种情况下时,可以关注下Unity 2018中引入的实体组件系统(ECS)是否更合适也是一个好主意,但本教程不会对此进行介绍。
2 形状运动
现在,我们的形状可以旋转了,但它们仍保留在它们产生的位置。让我们通过给每个形状一个随机的速度来改变它。
2.1 增加速度
就像我们做角速度一样,也给形状一个速度属性。
每个Update中,将速度乘以时间增量设置到形状的位置。我们可以使用局部位置而不是更昂贵的position属性,因为形状始终是根对象。
2.2 保存速度
保存速度,直接在角速度之后写入速度。