2016年2月24日

Uppercut Games 聊移动游戏开发,制作 App Store 新游戏 Danger Dodgers

作者 Andrew James

在 2011 年,一些前澳大利亚 Irrational Games 的开发人员一起组建了 Uppercut Games。我们先前已经用虚幻引擎 3 在 App Store 上发布过多款移动平台的游戏,包括 EPOCHEPOCH 2。去年我们首个虚幻引擎 4 的作品 Submerged 也登陆了 Steam,PS4 和 Xbox One。

在使用虚幻引擎 4 发布了一个 PC 及 主机的游戏后,我们想做一个更小但更快的游戏,于是我们又看了一眼移动平台。在做了一些尝试后,我们发现使用 4.9 的引擎版本的话,已经准备好所有需要的东西,只差发布游戏了,于是就有了 Danger Dogers,这个游戏刚刚登陆 App Store。现在来描述一下这个移动平台的项目时如何快速的从概念到完工的。

更短的开发周期

Danger Dodgers 的开发总共用了六个月,其中两个月制作原型,三个月的开发时间,以及最后一个月修复问题,调整和测试。共有六位开发人员在这款游戏上工作,其中四位全职,两位兼职。

材质,材质,材质!

我们发现开发虚幻引擎 4 的游戏和虚幻 3 的最大区别之一是在材质上更大的自由发挥空间,我们要在材质上更具创造力。但这是一把双刃剑,现在的 iOS 的新老设备之间有着巨大的性能差异,而我们希望支持从 iPad2 到最新的 new iPad Pro。我们发现设备是否支持 Metal 是这些设备性能差异的一个显著界限。

Simple Node Setup for Material

通过使用一个非常简单的 shader(见上图)以及单一数值的颜色,粗糙度和法线贴图,我们得到了每秒低于 10 的帧数画面(比如 iPad 2 这样的老设备)。并且我们还在不需要任何高光效果的很多 shader 上打开了 “Fully Rough” 的优化项,毕竟我们目标是做粘土动画风格,这么做效果不错。

扩展性

我们开发 Danger Dodgers 之初用的引擎的版本是 4.9,这个版本在材质的扩展性上有一些限制,当时需要为每个材质手动优化,在材质图内创建分支和细节等级。在后来的 4.10 中,我们就能够使用新的 iOS ES2 的预设质量设置。

iOS ES2 Setup

这套系统要求所有的 shader 都比要运行的设备质量更低。使用很容易,正如看到的那样,一行表示一个设备信息。我们最终在所有无 metal 支持的设备上都用了这个方法。立刻就在这些设备上取得了 10 帧的性能改进,于是游戏就从无法发布的情形立刻变成符合游戏可玩的标准了。

这个编辑、管理设备信息的新界面也十分有用,在那么多不同的 iOS 设备需要测试并管理性能的情况下,有一个用户界面可以来做修改,比起直接修改 .ini 文件要更节省时间,也不容易有输入错误或者打字的手误。

为移动平台测试

一次便能部署到多个移动设备上是一个很好的改进,我们设置了一个有供电的 USB Hub,并在它之上连接了 8 个设备。一个新版本能够一次部署上去。这个做法很好的改进了测试过程和游戏测试的效率。

Testing on all the iOS devices

Danger Dodgers 需要跑在各种 iOS 设备上

顶点 Shader

Danger Dodgers 用了一些顶点 Shader 来为场景增加一些生机。我们发现这中做法对性能的影响非常少(如果真的有影响的话),但在视觉上则对游戏能做很大的改进。

我们先做了一个叫做 “挤压和拉伸” 的。这个做法在陨星下落的过程中先拉伸它,在落地时挤压它,做出了一种橡皮的、有弹性的观感。下面是材质中的节点:

Squash and Stretch Node Setup

这里的做法稍微有点作弊。我假设了要拉伸并挤压的对象是圆的,好在陨石就是圆的。我还假设了物体的中心点在中间,好在这个模型刚好就是在中间,耶!在这两个假设下,上图的第一部分计算了每个顶点到陨石中心的距离,但只拿出了 Z 方向的数值,用于描述该顶点在陨石的 X-Y 平面的距离。在用它除以陨石对象的半径,获得一个 -1 到 1 之间的值,在乘以一个拉伸因子并用这个计算结果来偏移该顶点的 Z。所以效果简单说就是离 X-Y 平面越远的顶点,被拉伸或者挤压的程度越厉害。

为了要处理每个陨石的拉伸、挤压,在陨石生成的时候会有一个动态材质实例被应用。然后我在每个 Tick 中更新一个叫做 FallingObjectStretch 的变量,当陨石下落时,我将这个变量设到最大值,这么做在陨石下落时处于拉伸状态。当陨石落地时,我通过一个弹性缓动函数来计算并不再使用最大值,这是的陨石看起来像橡皮球一样被挤压再拉伸。我描述的弹性缓动函数可以参考 Robert Penner 的缓动函数,点击 这里 来了解。

我们来看一下动起来的效果:


另一个我们用到的顶点变换效果实际上是两个效果整合到了一个材质中,这个材质应用于场景中的大部分物件。当一个特别大的陨石掉下来时,落地周围的物件会弹起到空中,并重新掉落回去。这里是弹起部分的材质:

Bounce Material Node Setup

弹起效果并不像先前的挤压和拉伸效果的材质那样扭曲物体。我们只新建了一个基于物体相对撞击位置的 Z 方向的偏移。SphereMask 节点提供了从撞击位置的良好的衰减效果。这里的 LandedObjectForce 是由代码控制数值的,又一次使用了弹性缓动函数。这里的不同之处是它并不是基于单个对象的。所有的物体都通过一个 Material Parameter Collection 对象(就是全局 shader 参数)获取冲击的大小。这里的限制是一次只能对有一个陨石的落地产生效果。我们只将该效果用于很大的陨石落地才使用,所以大部分时候很难看到一个陨石落地会造成其他物件的弹起效果。

在 Danger Dogers 中还有一种特殊的陨石类型,这种类型的陨石会爆炸,将玩家推开。当一个较大的陨石是这种类型并且爆炸的时候,我们执行了一个全场景的“涟漪”扭曲效果。这里是该涟漪效果材质的一部分:

Ripple Material Node Setup

这里的基本想法是在场景中移动一个 SphereMask。我们通过持续增加 ExplosionRadius 并放置一个 SphereMask 在该半径,然后基于它们相对 ExplosiveLocation 的相对位置遮蔽掉顶点。当 ExplosionRadius 放大时,SphereMask 随之移动并影响相关的顶点导致它们的位置被推出并在 Sphere 移开后再拉回。嗯。。。希望这样说明能看得懂。下面这个视频展示了当较大的陨石落地并爆炸后的弹起和涟漪效果。

涟漪效果和弹起效果有一样的限制,同一时刻只能有一个爆炸陨石能产生全场景范围的效果。

这些节点图通过一个 Add 节点连接在一起,因此涟漪效果可以和正在弹起的物体效果叠加起效。

好了,这里说道的这些内容可能对有些人来说比较陌生,而有些人已经很熟悉了。希望大家对 Danger Dodgers 是怎么开发的感兴趣!

Danger Dodgers 在 AppStore 中已经上架了,可以免费下载,并告诉我们感觉如何把!

Andrew @UppercutAJ | Ryan @Luachunk | Uppercut Games