简介
这是徐若昊撰写的三篇技术系列博文的第二篇。该系列博文主要分享《逆向坍塌:面包房行动》背后的声音设计。各位可点此阅读第一篇博文。其中深入探讨了如何利用 Wwise 驱动游戏中的过场动画。第 3 部分很快就会发布,敬请期待!
为倾斜的 2D 视图构建定制的 Wwise 听者位置投射系统
技术系列博文 | 第 2 部分
《逆向坍塌》采用了独特的艺术风格。其中有个让游戏脱颖而出的艺术选择,就是使用倾斜的 2D 关卡地图。乍一看,游戏采用的是 2D 俯视视角。事实上,地图的每一关卡都经过了精心设计,它跟摄像机的朝向是有一定角度的。
基于典型的俯视视角实现 3D 音频相对来说比较简单。然而,对于像《逆向坍塌》这样倾斜的 2D 俯视视角,默认的 3D 音频系统可能无法提供准确的结果。最初尝试这种方法时就遇到了衰减问题,尤其是在左右或上下移动摄像机的时候。
为了解决这一问题,我们需要构建一个定制的系统来对默认的 3D 音频系统进行调整,确保其可与倾斜的 2D 俯视视角完美契合。
上图突显了我们当前遇到的问题:从摄像机视锥角度来看地图是倾斜的,这样会导致默认的音频衰减出现偏差。
要解决这一问题,可通过 Unity 的游戏对象、脚本和 Wwise RTPC 构建简单的投射系统,来建立一个专门用于音频定位的 X、Y 和 Z 投射坐标系。为此,可将听者从主摄像机上的默认位置移到对地图进行旋转并实施变换后的位置。这样就可与 Wwise 默认的音频衰减无缝集成。除此之外,在特殊情况下还可运用自定义的坐标系,来通过 Wwise RTPC 手动调整衰减范围。
为此,我们首先要将投射位置(下方视频中表示为洋红色立方体)设为 Prefab 游戏对象。该游戏对象应可绑定到任何摄像机,并与主摄像机保持固定的偏移距离。对于我们的项目,必须将该游戏对象做成 Prefab,因为游戏中有多个摄像机装置。所以,我们要能在运行时搭建或切换投射系统,并用作摄像机装置的游戏对象的子对象。不过,这一操作可能因项目而异。
在为投射位置设置 Prefab 游戏对象后,要将 Wwise Unity Integration 附带的 AkAudioListener.cs 脚本添加到 Prefab 父游戏对象。此操作会将其指定为游戏的听者。随后,我们要从 MainCamera 游戏对象移除默认的听者。
上图展示了声音投射系统中专门使用的听者游戏对象的 Prefab 设置;我们将其命名为 SoundProjectSampler。
以上视频从摄像机视角展示了地图存在的问题,并演示了系统在游戏引擎中的实际运行状况。
在 Wwise 中,可配置 RTPC 来将坐标数据从 Unity 传到 Wwise。藉此,可应用自己想要的声学修改结果。RTPC 的具体取值范围取决于游戏中地图的单位大小。在本例中,我们将取值范围设为 0 ~ 100。
跟上述解决方案一样,我们在摄像机对象上绑定脚本,并在 LateUpdate() 函数中包含这些 RTPC 调用。当然,您也可以使用 Update() 来实现同样的功能。不过,使用 LateUpdate() 可确保在更新音频坐标之前完成所有渲染操作。这种排序有助于在音频与画面之间保持同步。
AkSoundEngine.SetRTPCValue(CameraDistance_X, Normalization(soundProjectionSampler.transform.position.x, 0.0f, 100.0f));
AkSoundEngine.SetRTPCValue(CameraDistance_Y, Normalization(soundProjectionSampler.transform.position.y, 0.0f, 100.0f));
AkSoundEngine.SetRTPCValue(CameraDistance_Z, Normalization(soundProjectionSampler.transform.position.z, 0.0f, 100.0f));
注意,在上面的解决方案中,我们定义了一个名为 Normalization() 的辅助函数。该函数会将基于最小和最大范围的给定浮点值最终转换为 0 ~ 1 的取值范围。在此强烈建议通过类似方式统一设定当前所用 RTPC 的取值范围。本质上,该函数可简单表示为以下数学公式:
归一化后的值 = (要归一化的值 - 下限) / (上限 - 下限)
事实上,归一化公式的实现示例有很多,各种编程语言的都有(包括 C# 和 C++);只要在网上简单搜一下,就能找到大量相关结果,所以在这里就不赘述了。
在与此 RTPC 挂钩之后,我们可以借助 Wwise 默认的衰减系统获得精准的音频效果。除此之外,还可直接将 X、Y 和 Z 坐标 RTPC 应用于音频源本身来灵活地对每个声音进行微调。这样声音设计师既可自行设置衰减系统,也可在默认衰减系统的基础上进行扩展。
示例展示了在 3009 关卡中当变异菌菇被手雷引燃时是如何对其声音衰减进行调节的。最初,变异菌菇的声音被设为带 Wwise 衰减的 3D 声音并采用默认衰减设置。在此基础上,还会通过我们创建的投射坐标来驱动衰减。这样方便根据确切的游戏地图单位进一步定制和微调声音衰减。
除了与现有衰减曲线结合使用,X、Y 和 Z 坐标 RTPC 还可为游戏对象作用域的声音单独生成衰减效果。声音设计师可基于地图的每个轴对声音进行微调,在独特的地图角度下根据需要准确生成声学效果,就跟在《逆向坍塌》中一样。
声音设计师可据此打造身临其境的音频体验,确保跟游戏的画面风格相称并提升整体氛围。
免责声明:本文中使用的代码段都是重构的通用版本,仅用于演示目的。其底层逻辑经验证可正常运行。不过为避开潜在的版权限制,示例中省略了特定于项目的 API 调用和函数。
评论