大家好,我是吉米。在第 2 部分,我将继续向各位介绍《Murderous Pursuits》的对话和对白系统。
假如您还没阅读第 1 部分,请点击此处阅读!
上次我们回顾了有关在游戏中运用 Simlish 的一些想法,以及相应采用的对白剪辑和处理方式。这次我们来说说 Wwise 中的实际整合方案。首先,来看下对话容器的层级结构,简单了解下其包含的内容。
然后,最上面的是 VOX_CharConvo Switch Container(切换开关容器),用来设置应当触发哪个角色的交谈语音。该 Switch Container 会选择要播放的 Simlish 或对话音频类型。在此,我展开了 Brute 的对话容器:VOX_BruteConvo。其中,每个 Random Container(随机容器)包含一种对话类型,方便在触发音频事件时随机选择音频文件并播放相应的语音。
不过从上图应该可以猜到,Neutral、Positive 和 Negative 与其他容器相比略有不同。对于这三个容器,我们不仅需要随机选择文件,还要区分 Simlish 短语的长度和字数,同时保证对话的顺利进行。随机选择短语类型或单词本身其实很简单,只要多创建几个 Random Container 就可以了。不过对于实际的语音交流效果,还需进行更加详细的设置。下面来看下 Brute 的 Neutral Convo 容器对应的 Property Editor(属性编辑器):
这里做了几项设置。首先是 Initial Delay(初始延迟)。
该设置用于对循环动画进行基本的初始偏置,并由随机化器来选取具体数值。仅此而已。
接着是 Play Type(播放类型)。
这里设成了随机选取 Neutral 容器内 6 个选项中的一个。一般情况下,我们希望避免重复之前播过的音频片段,防止在短时间内反复播放同一片段。不过在这里,我们只想随意选择一个子容器,而不管其之前有没有播过。这样有助于掩饰各个类型之间的过渡,并使对话更加动态和多变。
然后是 Play Mode(播放模式)。这里设成了 Loop Continuously(连续循环)。
这些角色会一直不停地说话,直到系统触发使其停止的事件。比方说,又有一个人加入谈话或者旁边有人被杀死时所触发的语音事件。毕竟我们不想让一个人在那自说自话,即便像 Admiral 这样爱唠叨的角色,也总该有消停的时候。此处将 Transition Delay(过渡延迟)设在了 0 到 0.4 秒之间(算上随机偏置),让角色可以在短语的自然间歇和停顿之外稍微喘口气。
最初,我们尝试了在各个片段之间交叉淡变,但感觉像这样生硬地输出音频还是有点刻板,在实际交流中会显得不够自然。于是,又在 Simlish 的各个 Question 片段的结尾添加了一小段空白,同时结合了配音演员的音调变化。这样可以在播完一段语音后稍作停顿,让角色之间的对话更贴合现实生活中的交谈场景。
最后是 Weight(权重)。
角色的说话风格听起来会更偏向 Simlish 一些,因为我们希望能够一字一顿地播放语音,尽量避免一下说出一串单词,而只允许在个别情况下连续吐字。
除了以上各项播放设置,我们还在每个 Random Container 中添加了两个采用 Wwise Silence 插件制作的无声音频片段。这些片段的长度因所在容器而异。它们的作用是在讲话过程中插入长短不等的停顿,从而减轻听觉疲劳并使交谈显得更加自然。当然,也有可能会连续触发多个无声片段。不过这也很正常,因为不是每个人都有闲心说个没完。
下面来听下 Wwise 中单个角色的语音效果:
单独听起来还不错。不知在游戏中如何呢?
这样一听是不是好多了?在玩家穿过人群时插入一小段对话,会让游戏世界显得更加热闹而有生气。另外,我们还使用了 Wwise 的 ShareSet(共享集)功能,来控制声音随距离的变化。ShareSet 可以用来表示一系列随着距离变化的滚降值或衰减值。这样方便直接关联一组声音,而不用单独设置这些值。下面来看个 Conversation ShareSet 示例:
图中的曲线可以控制音量的衰减幅度,并在较远距离处加入高通和低通滤波效果。其中的绿色曲线表示 Spread(散布),用于决定声音在声场中的散布比例。在最小值处,会收缩成点声源。这时很容易确定声音来自哪个方向。在最大值处,会充满整个声场。这时不用管声源相对于听者的位置。不过,即便玩家就站在说话者旁边,其对声音的方向也会有一定的感知,所以我将其设成了 75% 左右。通过在声场内散布一定比例的语音,可以增强玩家对其他角色的邻近感,使其感觉自己就像对话当中的一份子一样。
另外,我还使用了 Cone Attenuation(声锥衰减)功能。它可以用来衰减音量,并根据声源朝向适当加入滤波效果。因为说话声音是从人身体前部的嘴里发出来的,所以在玩家位于说话者身后时音量应该会小一些。下面来看个简单的演示视频(注意右下角 Attenuation Preview 的变化):
游戏中声音的播放相对而言比较简单,至少从我的角度来说是这样。程序员在 Unity 中设计了一个自定义 Anim Event,便于我将 Wwise 事件与动画关联,并为循环动画设置单独的开头动画,以免其连续地重复触发音频。这些 Wwise 事件包含用来选择对话类型的 Switch(切换)动作和用来播放 VOX_CharConvo 容器的 Play(播放)动作。然后,我们可以通过代码来处理角色的选择。同时,我们还设有通用的 Stop(停止)事件,并为角色开始移动和播放其他动画(如攻击)时触发的所有对白类型添加了细微的淡出效果。虽不太精巧,但总归能用。
Anim Event 会获取一个字符串参数(此处为 Wwise 事件的名称),并将其用在 AKSoundEngine.PostEvent 调用中。我们选择了将该参数用于需要locomotion以外音频的所有动画,并把所有必要动作嵌入到单个 Wwise 事件中,而不是在动画时间线上分散设置多个 Anim Event。这是因为之前发现后一种方式有时会造成速度减慢和引擎失效问题,所以总的来说是不可靠的。于是,我们请教了 Audiokinetic 同行并按照建议采用了上面所说的前一种方式,没想到问题一下子就解决了(多亏了 Max 啊)。为了便于理解,下面来看个 Bludgeon Attack 事件,它包含了 14 个不同的 Action(动作):
今天就先说到这吧。游戏音频的设计有时像黑匣子一样精妙而又复杂,所以我希望该系列博文能让各位对背后的相关创作理念多少有些认识,并大致了解其中涉及的一些流程以及为了获得理想的听觉效果通常需要解决哪些问题。假如您对 Wwise 本身感兴趣,可以免费下载该软件并查看配套提供的各项教程和诸多资源。如需深入了解,请点击此处。
假如您想同时结合运用 Unity,请查看 Berrak Nil Boya 发布的视频,其中包括 Wwise Unity 整合教程及相关实用示例。现在的布局元素可能跟录制时不太一样,不过背后的基本原理仍然是相通的。
另外,我要特别感谢以下配音演员的出色表演(有兴趣不妨了解一下):
Ally Murphy
Amelia Tyler
David McCallion
Jay Britton
Kenny Blyth
Kim Allan
Toni Frutin
有空的话记得在 Steam 上了解下《Murderous Pursuits》。
感谢各位抽空阅读我写的博文!
Jaime
评论