《Headbangers: Rhythm Royale》是全球首款竞技类在线音乐游戏。在游戏中,您将与另外 29 名玩家同台竞技,伴随音乐节奏展开激烈的对决。在开发这款游戏的时候,我们遇到了各种各样的挑战。在本文中,我将简要介绍其中的一些难题,并向各位展示我们是如何设法摆脱这些限制的。
在线同步
我们在《Headbangers》中保持 30 名在线玩家同步的方式比较特别。该游戏基于的是角色对音乐事件做出的反应而非其在空间中的动作或行为。为此,我们决定将客户端和服务器与音乐及其播放进度同步。
时间和验证都是由服务器管理的。所以,我们可以检测出玩家与网络时间是否不同步。在时间延迟超过 100 ms 时,玩家会被重新同步。这意味着将在音乐中移动播放光标以将玩家同步到正确的时间点。不过凭借广泛且深入的网络优化,我们可以确保很少需要像这样重新同步。
要在 Wwise 中实现所有这些,我们面临着一个很大的挑战:Wwise 并不是专门为我们在这要运用的方法设计的。目前暂时没法简单地根据网络时间指令向前或向后移动音乐和音效的播放光标。
不过,我们想了个妙招(主要靠随机):利用过渡系统来构建特定的规则。事实上,我们可以在 Switch Container 的 Transitions 选项卡中创建一个从乐曲到自身的无淡变即时过渡并以此来根据需要移动播放光标。
不过,将这种方法应用于整个游戏会很繁琐。《Headbangers》包含上千个乐段(时长超过 50 小时),而且游戏中的每个乐段都要应用此流程。所以,我就做了下面的处理。
SoundBank 管理和优化
这款游戏包含的声音内容实在太多了。Wwise 中加起来有上万音效和音乐素材。随着游戏在各种主机和 PC 上发布,内存和 SoundBank 的管理(尤其对于 Switch)成了难题。
我的建议是尽可能提早预见此类问题。单就个人而言,我是在开发后期发现这个问题的,结果到最后不得不重新设计整个架构。
《Headbangers》里设有 23 个小游戏。最终,我们决定为其创建 24 个 SoundBank:每个小游戏对应一个 SoundBank,另外还有一个通用的 SoundBank(包含所有小游戏共用的音效以及菜单音效和音乐)。从内存管理的角度来说,有必要将声音分组存放到各个 SoundBank 中。为此,我们必须仔细考虑游戏中每个声音的用处和位置以便做整体上的优化。
秉承节省空间和内存的理念,我们还对转码实施了优化。为此,我们在 Wwise 中创建了多个转码参数。其中有些只适用于特定平台(如 Switch)。最终,通过在主机上将所有音效转码为 ADPCM,我们得以在几乎不影响品质的情况下节省大量空间,同时对音乐(游戏的关键元素)采用了 Vorbis 以获得更优效果。
将音频反馈与玩家动作同步
大部分游戏都允许在玩家按下按钮和给出声音反馈之间存在一定的延迟。不过在《Headbangers》中,我们无法容忍这样的延迟。确实,对于一款音乐游戏来说,如果按键动作跟声音反馈之间的时间延迟太长,玩家对声音和画面的整体感知会出现脱节。
为此,我们决定将流播放参数应用于跟游戏玩法直接相关的特定声音。在定义要流播放的声音后,可以更加快速地加以调用,从而有效缩短音频延迟。在此之后,要为每个声音设置 Prefetch 长度,以避免出现源匮乏或音频中断问题。
在其中的《Piano Mezzo Forte》小游戏中,我们的鸽子需要跟着背景音乐唱歌。为此,我们为音符的各种微妙变化(Piano、Mezzo 和 Forte)分别创建了 Event,并根据其特征和时长设置了 Prefetch 长度。最终的结果非常滑稽,而这正是我们想要的。就像下面视频展示的,这种近乎完美的同步非常重要。
动态菜单音乐
我最喜欢 Wwise 的一点是它可以轻松创建动态音乐。
虽然《Headbangers》对这方面的要求并不是特别高(游戏比较偏脚本化),但我还是为菜单创作了很多动态变化的音乐。玩家也很喜欢这样的设计。
我们的主菜单由多个标签组成,其分别代表游戏中的不同菜单:Home、Progress、Challenges、Customization、Shop、Options(参见以下视频)。
这种动态音乐的构建过程其实很简单。我为每个菜单都创作了一支曲子。不过,其全部都要采用相同的曲速、时长及和声行进。然后,只需使用 Wwise 过渡创建即时的 Same time as playing segment 过渡规则,就可从一首乐曲的某个时间点平滑而高效地移动到另一乐曲的相同位置。
设置起来非常便捷,效果也让我很满意。所以,Wwise 真的帮我们解决了《Headbangers》设计当中的很多难题。这个功能强大且稳定可靠的音频引擎对作曲家和声音设计师来说既好用又智能。
评论