All Walls Must Fall
2017年4月4日

《柏林墙必须倒》,随节拍而动

作者 Isaac Ashdown

大家好,我是 inbetweengames 的联合创始人和技术总监 Isaac Ashdown。我们团队是由三名前 YAGER 开发人员组成的小团队。YAGER 是一家柏林开发商,代表作有《特殊行动:一线生机》、《死亡岛 2》等。我们正在为《柏林墙必须倒》举办众筹活动,这是一部背景设定为 2089 年柏林夜店的科幻黑色策略游戏。在这篇文章里,我将向大家介绍,我们如何使用虚幻引擎制造这一设定之下十分重要的程序性混合音乐与音效。



在《柏林墙必须倒》中,一切都根据音乐的节拍发展。玩家控制一个能够穿越时间的秘密特工,他奉命在柏林夜店的地下世界执行任务。作为策略游戏,特工根据玩家的指令执行任务,而这些任务的时间限制以节拍为单位进行计量,同时同步一些音效,增强音乐的打击乐效果。在音景的基础上,我们还根据节拍同步了视觉元素,例如闪电和动画。我们的目标是制造出“音乐联觉”效果,让游戏中的所有声音和画面能够给予玩家热血沸腾的夜店体验。


blogAssets%2F2017%2FAPRIL+2017%2FAll+Walls+Must+Fall+Tech+Blog%2FAllWallsMustFall_TechBlog_Pic1-770x433-56f03e07f8e3b658936a5fe4ebf77cbb078cca8c

为了创作游戏的音乐,我们从电子音乐的编曲方法汲取灵感,创造了游戏中程序音序器,用于在玩家游戏的过程中组合不同的循环。这样,游戏就能考虑实际的游戏进度,从而加入一些乐器效果和变化,根据需要增强或减弱强度,而且在玩家制定战略决策的时候也会带来一丝紧张感。每个音轨都包含一个数据表,其中列出了所有循环以及每个循环的元数据,例如,乐器类型、强度水平、兼容的游戏模式。

这是一个非常复杂的系统,因为是根据一些玩法体系动态地添加和删除循环(或 stems)。幸运的是,通过使用虚幻的 UMG 系统,我们能够快速地组建一个视觉效果器,随时拿出来看看音乐系统现在正在播放什么。只需要将系统的一些参数公开给蓝图,我们就能使用一些简单的 UMG 小部件来创建一个视觉效果器,用来显示当前正在播放的循环、设置的游戏标记,我们甚至能够使用一些下拉列表更改参数来与这些系统交互。这样使得整个系统对新用户而言更加直观,而且我们还能与不同的作曲家合作,为系统创作音乐,确保系统在游戏过程中完全按照预期运作。



整个音频系统都使用虚幻的标准音频组件来播放所有声音。这使我们可以使用“声音提示”,让声音在播放过程中自行修改。我们的音频设计师 Almut Schwacke 创造了一些超赞的极具未来感的枪声,我们为每一层从一组变体中选择一些“随机”节点,然后使用这些节点以程序方式将不同的组件铺排在一起,之后“调节器”节点添加某个最终音调和音量变化,最后,“混合器”节点将它们组合起来。这样我们只用了一小组源音频就创造出了千变万化的音乐效果。

blogAssets%2F2017%2FAPRIL+2017%2FAll+Walls+Must+Fall+Tech+Blog%2FAllWallsMustFall_TechBlog_Pic2-770x396-b0604cb4ab6d59bd18ffbe21ef4a275e736c400c

“声音提示”框架本身就十分强大,而且扩展也十分容易,只需要创造一些自定义“声音节点”就可以了。只需要从 USoundNode 派生新的 c++ 类,并覆盖一些函数,我们就可以添加全新的功能,以用于向某个声音添加自定义效果。我们想要创造出这样一种效果,当你在外面的时候,透过层层厚重的混凝土墙,仍可以听到夜店的音乐,当你回到舞池后,就应该待在那儿,所以我们创造一个简单的“全局夜店 FX”节点。这个节点使用玩家在游戏世界中的位置,动态调整低通滤波器之类的参数,修改音乐并达到这一效果。



到目前为止,音频系统已经开发了几个月了,我们感到非常满意。柏林有很强烈的科技电子音乐氛围,一直以来,我们对游戏的计划都是寻找不同的作曲家和制作人来创作多样化的原声音乐。然而在我们的系统中,每个音轨都作为一组 wav 文件添加到游戏中,每个循环对应一个 wav 文件以及一整组元数据,较为复杂的音轨有 70 多个循环。我们使用虚幻的数据表系统把这些数据输入到引擎中,但很显然,添加这么多数据十分耗时,我们希望作曲家能够自行调整这些值,反复播放自己的音轨。此时正是自动化系统发挥作用的时刻。只需对“资产注册表 API”发出几个简单的调用,我们就创造了一个工作流,用户只需将自己的 wav 放到“资产浏览器”中,然后运行自动化任务,就能让编辑器自动将所有 wav 填充到数据表中。甚至能够执行一些简单的文件名解析,从中抽取可能已在文件中找到的元数据!

blogAssets%2F2017%2FAPRIL+2017%2FAll+Walls+Must+Fall+Tech+Blog%2FAllWallsMustFall_TechBlog_Pic3-770x292-e708746692f978524bd7542d9a3b102d53fa838e

随节拍而动的不仅仅是动作和枪声,还有环境元素。夜店里的人跟着音乐节奏跳舞,灯光四处摇晃,舞池也充满了律动。大部分效果都是使用蓝图的时间线设置的。为获得最大的灵活性,我们想要确保能够使用任何时间线或曲线,并根据节奏做上标记,而不会受到时间线长度或者音轨速度的影响。因此,音轨开始时我们计算出一个乘数,将时间线的自然长度转换为一组节拍,使用“设置播放速度”节点相应地加速或减速时间线。然后,可以在音轨开始时播放任何时间线,使用它的输出根据灯光强度、材质参数或律动得出结果。

blogAssets%2F2017%2FAPRIL+2017%2FAll+Walls+Must+Fall+Tech+Blog%2Floopdance-094ba326939a84f68243fdbeb3dd4c1455dc2351

我们以前在 3A 级工作室就有多年的虚幻引擎使用经验,所以毫无疑问地选择使用虚幻引擎创作第一个独立项目。但是,确实很难以置信的是,虽然我们是只有很少预算的小团队,引擎的可扩展性和能力让我们达到了远超自己能力的目标。在开始项目之前,我在音频编码和声音设计方面确实涉猎较少,但对工具链很熟悉,而且基础系统的扩展性很强,这样我们就能使用创新方法为独立游戏创作音频,最后也确实取得了成功。

我们制作《柏林墙必须倒》已经超过一年了,现在正在发起众筹活动,为将于今年五月开始的封闭 Alpha 内测集资。如果您对 Alpha 内测感兴趣,请快来看看众筹吧!