《11-11: Memories Retold》是一款叙事游戏,其背景设在第一次世界大战期间,讲述了两个角色在西部前线发生的故事。其中,Harry 是一名年轻的加拿大战地摄影师,为了打动心仪的女孩参军入伍。Kurt 是一位年长的德国工程师,为了寻找军中失踪的儿子投身前线。在游戏中,玩家将交替扮演两个角色。这并不是一款射击游戏,其重点在于讲述两个角色以及不同阵营的人如何被战争影响的故事。该游戏以第三人称视角在探索和叙事场景之间交替切换。
这款游戏由 DigixArt Studio(法国)和 Aardman Animations(英国)联合开发,并由 Bandai Namco 发行,适用平台包括 PC / PS4 / XboxOne(2018 年 11 月 9 日发售)。游戏的画风非常独特,它采用了油画效果实时渲染游戏,其成千上万的着色笔画将游戏场景呈现得栩栩如生。
伊利亚·伍德 (Elijah Wood) 和赛巴斯汀·柯赫 (Sebastian Koch) 分别为 Harry 和 Kurt 配音。奥利维尔·德里维耶 (Olivier Deriviere) 担任游戏音乐的作曲。奥利维尔·兰克特 (Olivier Ranquet) 制作了宝贵的原始素材,最终由我们的实习声音设计师安托万·夏布鲁 (Antoine Chabroux) 加以整理。我本人则主要负责音频的技术实现(Wwise 工程管理、Unity 整合、自定义音频工具及相关音效和拟音设计)。
考虑到以下原因,我们很快就决定选用 Wwise 来管理游戏音频开发:
- 我们要开发的是一款多平台游戏:利用 Wwise,可以针对平台轻松管理转码和流播放设置,并进行性能分析、优化和调试
- 我们需要在两个角色之间交替切换场景(这款游戏的一大特色):Wwise 提供有各种内置功能,方便管理这种内在逻辑
- 当时开发团队规模较小,而且我得远程工作:Wwise 不仅能帮助我独立地完成工作,而且还可以减轻程序员的工作负荷
前期工作
当时 DigixArt 团队刚成立不久,这是我们和 Aardman 第一次打造如此规模的游戏。刚开始甚至都还没为 Wwise 建好音频管线,而且 Unity 中使用的可视化脚本工具也没有专门针对 Wwise 的内置节点。我在前期就应邀加入了制作团队,这给了我们时间进行充分的前期制作准备。我们希望能在忙于制作之前事先构建一条切实可靠的音频管线。
《11-11: Memories Retold》是一款由剧情驱动的游戏。为了清晰地表达游戏剧情,叙事内容必须经过精心设计。因此,我首先要做到的一点就是在 Wwise 和 Unity 之间构建一个语音合成系统,以便关卡设计师围绕语音(旁白或剧情对白)规划和设计游戏。
这时,我突然想到了 Bernard Rodrigue 开发的 WAAPI 示例工程。它可以依据 Sound Voice(语音)对象的 Notes(备注)生成机器人语音音频文件。在本机上进行实验之后,我向程序员解释并指出了相关的实用功能,以便其创建一个按照以下方式运作的大型系统:
- 编剧制作一个电子表格,并每天更新该文档
- 创建自定义音频电子表格,并导入对白编号和对白台词(如下图所示)
- 将这个制表符分隔的文档导入到 Wwise 中,以此创建 Sound Voice 对象,并按照对白编号进行命名,同时将对白台词设为 Notes。然后额外添加一列,以便在正确的 Work Unit(工作单元)下创建 Play_ 事件
- 最后由 WAAPI 读取前面创建的 Sound Voice 的 Notes,并生成机器人语音及对应的 SoundBank(音频包)
这些全都编入到批处理文件中,并在每天早上由系统自动执行。该系统可以确保关卡设计师和我本人每次使用的都是最新的对白台词。这对在语音录制阶段之前合理规划游戏来说非常关键(当然,在将实际语音整合到游戏中之后肯定还要进行一些调整,不过这个系统确确实实节省了我们不少时间)。
示例 – 在 Wwise 中导入自动创建的音频电子表格
在试玩原型版本并研究游戏设计文档后,我列出了想要从游戏引擎传给 Wwise 的数据。
首先,我自己列出了大部分必要数据:
- 角色的 Switch(切换开关):用于所有角色专有元素
- 角色的 State(状态):用于所有全局元素(环境声、音乐…)
- 角色的 Stance Switch(角色蹲伏、奔跑、攀爬…):用于所有运动拟音
- Footsteps Material Switch 和材质检测系统
- 角色的 Speed RTPC
- AkListener 的位置 RTPC(X、Y 和 Z)
- 各种与游戏功能对应的 State:NPC Dialogue On/Off、Cinematic On/Off、Voiceover On/Off、Puzzle view On/Off、Menu On/Off、GameView(PuzzleView、ExplorationView、CameraView、CardGameView…)
- 多个核心 Event(事件):Level_Start_ 和 Level_End_ 事件;Menu 和 Pause 事件…
然后,程序员帮我插入这些数据,并开发了与每个角色(主角或 NPC)关联的通用 C# 脚本。同时,所有游戏玩法元素(谜题、Harry 的相机等)也关联有通用脚本,便于向 Wwise 传递谜题/游戏的当前状态。
每次关卡设计师添加 NPC 或谜题的时候,Wwise 中内置的所有逻辑系统都会自动应用于这些新增元素。假如我要修改或添加元素,只需修改父级预设,便可更新关卡中的所有子级预设。
关键在于,在前期加入团队让我有时间构建通用的自适应系统。这在制作过程中节省了我很多的整合时间,让我得以创建一套完善的调试流程,并藉此逐步完善互动混音。
整合和互动系统
对于所有剧情语音,我都设置了两个 Attenuation ShareSet(衰减共享集)。其中一个用来逼真地模拟现实中的声音衰减效果。另一个则具有十分平缓的曲线,它只会对语音进行部分衰减/滤波,以此确保其始终清晰可辨。通过在 Actor-Mixer 中拖放应用有其中某个衰减 ShareSet 的 Sound Voice,可以保证玩家无论在做什么都不会漏掉关键对白。
旁白 (VO) 在探索、过场动画、解谜…过程中随时都可能会插入进来,而在这些 VO 序列中有时还会触发各种其他音频事件。如此一来,就很难保证语音不会被其他声音掩盖。为此,我们选择了通过自定义节点来调用语音台词。它方便将台词灵活地设为叙事声 (VO) 或剧情声,并连续播放多个 Wwise 事件,确保在事件发生过程中或事件全部结束后输出不同的内容。
通过自定义节点播放对白或旁白
在设为 Narrative 时,将触发 Wwise 中不同的设置,进而对混音产生相应影响:
- 在第一个 VO 事件开始时,将 VoiceOver State 设为 On;在节点的最后一个事件结束后恢复为 Off。该 State 会在 Bus(总线)层级闪避除 VO 外的所有其他声音,同时还会应用高通/低通滤波。在创建此自定义节点后,关卡设计师可以精细设置 VO 事件(添加、移除或切换 VO 台词),同时保证无论播放几句或哪句 VO 都不会影响叙事混音的通用性和连贯性。与 Auto-ducking(自动闪避)相比,我更倾向于使用 State。因为,在 VO 总线没有输出任何音频时也需要应用这种混音设置(比如在两句 VO 台词之间插入长延迟)
- 将 RTPC_Voice_Over_Effect 设为 1:此 RTPC 会从 0(没有播放 VO 时)逐渐变为 1(每次播放 VO 时)。该 RTPC 用来降低音乐、环境声和音效总线所应用的压缩器的阈值,避免音量较大的声音与 VO 重叠
VoiceOver State 将从 3 dB 开始逐渐降低 Music 总线的音量。这在大声播放整首管弦乐时显然是不够的。为了确保 VO 清晰可辨而又不会把音乐的音量降得太低(并且为了避免可能出现音乐在压低和抬升时听起来音量变化非常突兀的情况),我专门使用了一个 EQ 来滤除音乐中与 VO 中最突出的频段相重叠的频段。我将一个 RTPC 指派给了 VO 总线的电平表,并通过此 RTPC 来控制两个频段的增益变化。最终,不仅能在大声播放管弦乐时听到 VO,而又没把音乐的音量降得太低。
在 Music 总线上应用 EQ,并由 VO 电平表闪避两个频段(采用大 Q 值)
在游戏中某个时间点,玩家会控制着 Kurt 的猫来回走动。最初,我将 Wwise 事件放在了动画时间线上,但发现这样产生的脚步声效果并不理想。因为动画速度会随着玩家输入不断变化,容易导致脚步声的节奏跟画面不一致。
后来,为了获得更加逼真的效果,我在 Continuous/Loop(连续/循环)模式下使用了一个随机容器,以此通过猫的运动速度来控制 Trigger Rate(触发速率)的值(音量和音高也是如此)。同时,采用代码来管理播放事件。在速度大于 0 时,会触发 Play_ 事件;一旦速度降到 0,即调用 Stop_ 事件。
音乐
作曲家奥利维尔·德里维耶从项目刚一开始就加入了制作团队。他为游戏创作的音乐不仅美妙动听,而且能够很好地传达角色丰富的情绪。它可以引导叙事并随之不断推进,从而突显 Kurt 和 Harry 的心理变化。这首管弦乐由 The Philharmonia Orchestra 演奏,并在 Abbey Road Studios 录制。
在 Abbey Road Studios 录制游戏配乐
这款游戏的结构相对来说比较简单,所以并不需要复杂的互动音乐系统。整合工作主要集中在如何精心设定音乐的播放时机,以此为游戏叙事和玩家任务提供辅助。实现起来非常容易:只需创建一个主要的 Switch Container(在游戏开始时播放),并针对各个事件(Level_Start、VO 事件)或在可视化脚本工具中设置 Set State(设置状态)动作即可。
奥利维尔浅谈创作和录制流程
如需试听整首配乐,请点击此处。
混音
Wwise 提供有很多互动混音选项,但是鉴于这款游戏的风格,我并没有考虑使用 HDR 混音(脚本基本上不用修改,同时触发的事件数也有限制)。最终,我结合使用了自定义旁链、State ducking(状态闪避)和 Auto-Ducking。然后,根据是否在闪避总线没有输出任何音频也要保持闪避,来确定是选用 State ducking 还是 Auto-Ducking。每次闪避只会将音量偏置 -2 ~ -6 dB,虽然从本身来说并不多,但在不同情况下这些值会叠加在一起,从而产生不同的混音效果。
混音系统简图
通过使用 State ducking 而非 Auto-Ducking,我还可以针对特定 Sound SFX 增大或减小闪避幅度。比方说,假如我想将某个 Sound SFX 闪避得少一点,可为其添加 VoiceOver State,并对总线层级所应用的音量衰减和滤波加以补偿。当然,也可以采用同样的方式将某个 Sound SFX 闪避得多一点。
另外,我还使用了内置 Azimuth 参数来控制 RTPC,以此闪避 AkListener 视野之外的特定发声体。这样便于生成清晰的混音,从而帮助玩家集中注意力(比如,在链接到 Pitch 曲线时,可直接使用 Azimuth 参数,来模拟飞机掠过时的多普勒变调效果)。
Azimuth RTPC 滤波器和音量曲线
结语
《11-11: Memories Retold》是一款由剧情驱动的叙事游戏,其中音乐和 VO 在声景构建中起着关键作用。考虑到这一点,我最终选用 Wwise 构建了通用的自适应系统来实现声音整合,进而借助音频来推进剧情并将角色情绪传达给玩家。
评论