简介
学习新工具的一个妙招是尝试打破其既有的使用规则。你永远不知道在打破成规时会得到什么,尤其是对像 Wwise 一样应用广泛的工具。该软件用于将互动音频整合到游戏引擎中。但是,它本身可以用作游戏引擎吗?可以直接在 Wwise 中构建游戏吗?
这就是我为自己设定的任务。我想走得更远一点。在非游戏引擎中构建游戏对我来说并不稀奇,我平时本来就喜欢捣鼓一些异于寻常的项目。比如,为漫画创作音乐或在 Reaper 内制作带随机生成关卡的游戏。
Wwise 有各种各样的潜在功用。每次听到它被用于游戏以外的目的(比如现场戏剧表演或艺术装置),我都跟发现了新大陆一样激动。之前,我尝试过在 Wwise 中为序列音乐构建自我驱动机制(就像 Steve Reich 或 Arvo Pärt 一样)。在琢磨如何在 Wwise 内编排 Arvo Pärt 的作品《Spiegel Im Spiegel》时,我还特地构建了主要基于 Event Cue 的自我运行机制。对于该项目,我不会细作探讨,因为它还需要一些改进和优化。但本质上就是几个示例 Switch Playlist,其不播放任何声音,唯一目的就是设置 Switch、触发 Event 来激活其他播放列表或设置 RTPC 值。这些 Switch 可以转换为播放列表的播放顺序,RTPC 则可输出到采样乐器的移调 MIDI(Actor-Mixer Hierarchy 下)。整个工程中只有一个 "Play" Event,其会触发并激活分散在 Actor-Mixer Hierarchy 和 Interactive Music Hierarchy 下的几个别的 Event。
图 01 - Wwise 中的《Spiegel Im Spiegel》
将 Wwise 用作游戏引擎
有了在 Reaper 中构建游戏的切实经验以及之前 Wwise 工程的自我运行机制,我想试试看能不能直接在 Wwise 中构建游戏。在很长一段时间里,我觉得根本不可能。其中有个无法解决的主要问题,那就是到底如何显示游戏信息。为此,我开始琢磨要将哪里作为游戏显示界面。Wwise 没有赏心悦目的色彩和新颖有趣的界面,但是它有大量的编辑器窗口和性能分析器视图。显然,性能分析器最为适合显示游戏信息。但是要显示哪些信息?选择哪个性能分析器?
对此,我的第一个想法其实是构建一个专注于资源管理的游戏:用 SoundCaster 作为控制器,用 Advanced Profiler 中的 Voices Graph 作为主显示窗口。在捣鼓 Voices Graph 的时候,首先让我感到头疼的问题是其一次会显示很多信息。比如,Event、设备、目标、虚声部、音量、LPF、HPF 和 Effect。好像都是杂乱无章的信息,很难搞清楚应该关注什么。不过,我很快便决定利用这一优势。Audio Bus 和 Audio Device 的命名其实可以清楚表明游戏玩法。比如,将一个 Audio Device 命名为 GreatCountryOfDenmark,将另一个命名为 SadCountryOfSweden,以此展示丹麦和瑞士这两个宿敌之间旷日持久的较量。
该游戏的基本目标是将资源管理与《Cookie Clicker》游戏结合来生成比瑞典更多的公民。单击 Event,它就会生成一个存活三到四秒的丹麦人。我给瑞典创建了 AI,其 Music Playlist 基于一个简单的循环运行,每三秒播放一个 Music Segment,每三秒生成一个新的瑞典人。好,现在我们把游戏设计好了。丹麦将最终摆脱作为瑞典小弟的名声。下面,我们来看看在性能分析器中是什么样。
图 02 - Voices Graph 中丹麦与瑞典的较量
嗯…看上去不是很清楚,对吧?Voices Graph 仍然一团糟,很难看清发生了什么。最终我决定放弃这个想法,因为事实证明它太复杂了。如果有人想接着开发,不妨把它做成完整的游戏!
在从这些尝试中吸取经验后,我终于破解了如何使用 Voices Graph 显示比较简单的信息并将 SoundCaster 用作控制器来构建游戏。
明确游戏机制
我想大家应该或多或少都听过名叫《打地鼠》的经典嘉年华游戏。玩家的任务是拿着锤子敲打可能从四到六个洞中随机冒出的地鼠。玩家要迅速出击打中地鼠,否则它会再次消失在洞中。玩家每次打中一只地鼠就会获得一分,出手速度快的话还可以获得高分奖励(具体得分取决于玩家的反应速度)。
在明确游戏机制后,便可使用 Profiler 和 SoundCaster 在 Wwise 中构建游戏了。虽然我们没有实体的锤子或真正的地鼠,但这并不妨碍在 Wwise 中再现游戏玩法。为了让游戏正常运行,必须构建多个系统并将其互连。
我们先来构建 MoleGenerator,并让其以随机间隔弹出地鼠。第一步比较简单,包括创建 Music Playlist Container,并将播放模式设为 Random Continuous。播放列表会播放四个地鼠声音文件之一或 NoMole。后者是空的,所以不会被发送到 Audio Bus。就跟我们在资源管理游戏实验中看到的那样。对此,稍后再细说。
通过限制 NoMole 的长度并在播放列表中复制,可将地鼠再次冒出之前潜藏的时间长短随机化。编号 01-04 的权重特意设在了 50 以下,NoMole 的权重则全部设在了 50 以上,以确保每次弹出地鼠都会有一个停顿。停顿的时长取决于 NoMole 被播放的次数。
图 03 - MoleGenerator
编号 01-04 的长度相同。它们都有一个空的 Music Segment。除了显示在 Audio Bus 中,它没有任何别的用处。在深入探讨这个问题之前,我们先来看下 Event Cue 是怎么用的。对于没有用过 Event Cue 的人,我觉得有必要稍微说明一下。简单来说,它们是可从 Music Segment 中的特定位置触发 Event 的可编程标记点。在典型的游戏项目中,可使用其来触发 Stinger,在恰当的拍子上播放 SFX,甚至在最为关键的战斗音乐中将环境声静音。在本例中,它们的作用是设置 Switch,以此指示地鼠是冒出 (Up) 还是潜藏 (Down),并告知系统正在操控哪只地鼠。在 Music Segment 的开头会触发 "MoleUp" Event,在其结尾会触发 "MoleDown" Event。
图 04 - Event Cue 告知系统地鼠是冒出还是潜藏
现在,我们设置好了地鼠冒出和潜藏机制。接下来,我们看看锤子机制。锤子背后的逻辑其实很容易理解。具体来说,就是通过 Switch 来控制锤子是打偏 (Miss) 还是打中 (Hit)。经过摸索,我发现最不容易出错的方案是为游戏中的每个地洞创建四个 Switch。每个锤子 Switch 都由与之对应的 Event 触发。在玩家按下 "Wack01" Event 时,会触发 "Hammer01" Switch(如下所示)。它只有两种可能的结果:Hit 或 Miss。对其他锤子来说,也是如此。在 Path 分区可以看到,Hit 其实只有一种可能的结果,而 Miss 的情形则多种多样。如果玩家打中地鼠,会播放表示获胜的音效;如果打偏,则会听到简单的嗖嗖声。
后来,我为打中或打偏添加了 Event Cue,目的是建立得分系统和生命机制。这样我们就可以在整个游戏中增添失败和获胜状态。在打中时会触发 "Score_1up" Event,在打偏时会触发 "Life_1down" Event。
图 05 - 利用 Music Switch Container 实现 Hit or Miss 机制
至此,《Wwack-A-Mole》的基本功能就算讲完了。在确保所有这些游戏机制都能正常运行后,我们来看看如何使用 SoundCaster 和 Profiler 来显示游戏。
用 SoundCaster 作为手柄,用 Profiler 作为显示界面
手柄包含四个按钮(Wack01、02、03 和 04),用于激活上节所说的 Music Playlist。Event 根据地鼠做了颜色编码,所以很容易识别。如果在屏幕上看到绿色地鼠,就点击绿色 Wack 按钮。
在手柄旁边,有两个与游戏状态相关的按钮。其中 StartGame 按钮基本上只是播放 Music Segment,其配有大家熟知的马戏团音乐 (Circus Music)。由此开始,触发游戏的其余部分。在音乐的前奏部分,会触发几个空的 Event Cue,并发送到名为 Readme 的 Audio Bus。我发现可以创建文本教程并显示在 SoundCaster 中:直接重命名音频文件并通过 Event Cue 依次播放它们。文本长度都在两秒左右,跟音乐的曲速完全吻合。整个前奏如下:
Welcome // to Wwack a Mole // SMASH those events // and hit the moles // They will pop up randomly // and disappear quickly // So get ready //
截图中的最后一个 Event Cue 为 MoleGenerator,其会在前奏结束、音乐开始时被激活。在 SoundCaster 中,可以看到名为 SkipTutorial 的按钮。它的作用是对音乐的音频文件进行寻址,以便跳过前奏并在触发 "MoleGenerator" Event 之前播放。后来我发现,我花在音乐上的时间绝对是最少的。最终,只得到了非交互式的配乐以及从 A 播放到 B 的简单 WAV 文件。看来关于游戏开发,还有很多东西要学。
图 06 - Event Cue 显示教程文本
为了以最佳方式显示游戏,我的想法是在 Advanced Profiler 选项卡的 Voices Graph (F6) 中滤掉不必要的对象。这样的话,如果在 Object Filter 中选择了 Master-Mixer Hierarchy 下名为 WwackAMole 的 Work Unit,将仅显示名为 Readme(游戏教程)、Enjoy And Listen(音乐)和 Wack it! 的 Audio Bus。最后一条 Audio Bus 包含玩家应当对之做出反应的游戏对象。除此之外,还有一条名为 InvisibleProfiler 的 Audio Bus,用于处理应当对 Profiler 隐藏的未分类声音。它可以是游戏系统,但也可能包括采样器、SFX 或环境声。
SoundCaster 还提供了另一组可以利用的信息。Switches 分区会显示地鼠是冒出还是潜藏以及哪个地鼠处于活跃状态。理论上来说,该系统无需将 Voices Graph 作为显示界面,直接使用 SoundCaster 就可以。在项目后期,我开始添加 Difficulties、Lives 和 Scores 机制。我设法将 State 用于所有与玩家相关的全局游戏系统,然后使用 Switch 来实现玩家不太需要看到的局部游戏机制。关于如何构建 Lives 和 Scores 机制,在此我不做进一步探讨。因为其仍在开发当中,有些地方还需要优化。
要点总结
总而言之,游戏的基本原理是按下 "StartGame" Event 来激活 Music Playlist 及游戏音乐。这些音乐会被发送到名为 Enjoy And Listen 的 Audio Bus。
在音乐文件的前奏部分,会有几个 Event Cue 触发 Actor-Mixer Hierarchy 下的无声音频文件。它们的作用只是在 Voices Graph 中显示与文件名对应的一段文本。这些文本文件会被输出到名为 Readme 的 Audio Bus。文本可为 Welcome to Wwac-A-Mole 或 Get ready。
在屏幕上显示最后一段教程文本后,会从 Music Segment 触发最终的 Event Cue。该 Event Cue 名为 MoleGenerator。它会触发 Music Playlist 并生成 Mole01、Mole02、Mole03、Mole04 或具有随机长度的无声片段。Mole-Events 会告知系统哪只地鼠被激活以及状态是 MoleUp 还是 MoleDown。这样可以为 Hit or Miss 系统奠定基础。Mole-Events 显示在名为 Wack It! 的 Audio Bus 中。
在 SoundCaster 中可以看到四个按钮:Wack01、Wack02、Wack03 和 Wack04。它们会播放名为 Hammer01、Hammer02、Hammer03 或 Hammer04 的对应 Music Switch Container。各个 "Hammer" Switch 会检查地鼠是冒出还是潜藏,并据此决定是播放 "Hit" Event 还是 "Miss" Event。比如,对于 Mole01,要想激活 Hit,必须在 Voices Graph 中显示 Mole01 的同时按下 Wack01。如果按下 Wack02、Wack03 或 Wack04,就会导致打偏;如果在 Mole01 潜藏时按下 Wack01 太晚或太早,同样可能导致打偏。打中时会听到 Ding 音效,打偏时会听到 Woosh 声。
游戏的玩法是在恰当的时机打中正确的地鼠。如果打偏,就再试一次,直至玩到厌倦为止。实验功能包括 "Game Over" State 和 "Win" State。它们建立在带有 Scores 和 Lives 的 State 之上。每打中一次加一分,连续打偏三次结束。如果音乐播完都没打偏一次,就算通关。
(国内观赏视频通道)
下一步?
简单来说,这样便可在 Wwise 中构建游戏。实现起来相当简单,对不对?当然,还有很多有待改进之处。不过,我希望它还是有意义的。至少,可以供大家借鉴。您也可以在 Wwise 中做实验,试着像我一样突破它的界限。最终的意义在于测试自己的技能并设法实现别人做不到的东西。这就是我喜欢在 Wwise 中做游戏项目和《Spiegel Im Spiegel》的原因;它帮助我创造性地思考问题,并实现了之前做不到的事情。
说到跳出 Wwise 的既有使用规则,我想好好夸夸雷莎•施沃德 (Ressa Schwarzwald)。她可是 Audiokinetic 社区的名人。如果没有她最初的想法和对开发古怪项目的热情,我就不会在 Wwise 中构建像游戏这样不实用的东西。作为 Robotic Orchestra 的构建者,她当然想把游戏提升到一个新的高度。她想到了在 iPad 上使用 TouchOSC 玩这个游戏。我试图说服她在 iPad 上拿锤子砸。说来也怪,这个想法并不受欢迎。不管怎么说,她挺厉害的。
(国内观赏视频通道)
事实证明,《Wwack-A-Mole》在游戏音频聚会上也很受欢迎。我把它作为娱乐项目带到了在哥本哈根举办的游戏音频圣诞派对上,结果大家玩得不亦乐乎。这可是个测试游戏并从核心用户那里获取反馈的好机会。有人说明白我是怎么想的,但不确定如何玩这个游戏,对背后理念感到有些困惑。派对上有个不愿透露姓名的业内传奇人物,他表示说地鼠的生成速度太快了不好打中。为此,我们添加了高级模式,留了充足的敲打时间。你猜怎么着,他成功通关了!
游戏有很多地方可以扩展。只要想得到,都能加进去。跟所有其他受时间限制和实际应用约束的游戏一样,《Wwack-A-Mole》还没有完成,只是做了个框架。我能想象到有各种各样的功能可以提升这款游戏的体验。我们就先说说配乐吧。遗憾的是,作为一名作曲家和声音设计师,我在保证充实的音乐体验方面投入的精力很少。由于忙于在 Wwise 中进行游戏设计,我将音乐制作推迟到了管线的末端。在截止期限前的最后几小时,我才仓促做了个粗糙的方案。相信很多作曲家和声音设计师都听得出来。我希望完全由 MIDI 生成配乐,其具有节奏变化、采样乐器和互动分层来满足玩法需要。我想不出有什么软件比 Wwise 更适合制作自适应配乐。没能实现这一点,我感觉特别遗憾。对于这个项目,我想尽可能开放给大家协作完成,有兴趣的话可以进一步优化游戏。我把 Wwise 工程整个放在了 Github 上,欢迎各位根据需要对工程修改和改进。想创作配乐或设计音效?好得很,交给你了!想帮忙构建高分系统,或是继续我那才完成四分之一的剧情模式?没问题,可以;如果游戏音频社区能一起完成这款游戏,我会很高兴。
还有一件事…
我在 Wwise 中成功构建了游戏,应该可以告一段落了…对吧?其实,我还在 Wwise 中做了个游戏。它的灵感来自当时流行的 Netflix 节目《Squid Game》。节目中的选手必须在计时结束前跑到终点,但是只能在可怖的机器人没有看着时移动。否则,它就会开枪。听起来挺吓人的。
在此,我不细作探讨。但跟《Wwack-A-Mole》相比,它的游戏机制还要简单一些。游戏的运行机制同样存在于 Interactive Music Hierarchy 下。其中,包括巧妙地使用 Switch 音轨来确定机器人是否看向别处,可以放心奔跑;或者是否在扫描关卡,玩家在 SoundCaster 中按下 Walk 按钮会出现危险。每在 SoundCaster 中按下 Walk 按钮五次,玩家就会移动一段距离,最终要在计时结束之前移动 20 米。以上两种情况分别基于包含 20 和 60 个子对象的 State Group 运行。每次重新开始播放歌曲,都会稍微加快播放速度。这样会变得越来越紧张。
不妨转到 Github 下载游戏亲自试试:https://github.com/Gminorscale/Wwack-A-Mole/wiki
(国内观赏视频通道)
我真心希望这些项目能激励各位在 Wwise 中做一些打破常规的实验。而且,我也很想看看大家会想出怎样稀奇古怪的项目。反正它们激发了我在 Wwise 中的创造力,让我得以从不同以往的角度探索它的功能。作为声音设计师和音频技术人员,我们经常受到所用程序功能限制。为了实现目标,常常不得不编写自定义代码或使用额外的附加软件。通过这个项目,我想看看自己能走多远。我想知道,只用 Wwise 而不用任何其他工具到底能做到哪一步。
无论是有其他问题还是单纯想交流想法,都可以在 Twitter 上给我发消息。感谢阅读这篇文章,祝各位心情愉快!
评论
Yuen Charles
August 11, 2023 at 05:45 am
太可笑了~太有爱了!