游戏音频技术备忘 (四) Wwise Unreal Engine 集成代码浅析 (一)

时间:2021-07-17 15:15:00
  在Engine\Plugins\Wwise\Source下为主要Wwise相关代码,AkAudio文件夹下为运行时相关代码,AudiokineticTools下为编辑器工具相关代码,AudiokineticTools.Build.cs为用于UnrealBuildTool的相应代码,与音频直接相关位于 AkAudio文件夹下。
 
  Unreal Engine提供若干宏来实现GC、序列化、网络等需求,譬如声明为UPROPERTY()的变量与UFUNCTION()的函数即可由引擎实现变量复制和远端调用 ,详细内容可参阅Unreal Engine文档UE4中的C++编程介绍。
 
 
  AkAmbientSound类为基本的预埋环境点声源对象,继承自AActor类并拥有一个用于在游戏世界内作为声音播放承载的组件对象AkComponent,一个StartAmbientSound()函数用于播放,StopAmbientSound()函数用于停止,对于性能方面需求可以实现相关逻辑,来控制一定范围内的点声源的播放量( 由于Wwise本身提供一个性能相关的图形化管控方案所以这方面也不用过多考虑)。一般来说如果不需要单个控制点声源播放可以通过AkGameplayStatics的StartAllAmbientSounds()及相应的停止函数来控制环境声源的播放。该类对象的实例化可通过在Unreal Editor内直接添加 AkAmbientSound到场景来实现。
 
  AkAudioBank类作为Unreal Engine的资产对象来实现暴露Wwise的.bnk格式数据包(由于Unreal Engine对资产统一封装为uasset,因此需要该种方式实现管理,实际 .bnk 声音数据默认生成在UE工程的Content\WwiseAudio下),通过Load()函数实现加载到内存,考虑到磁盘IO及内存性能,默认的AutoLoad属性为true在文件较小时可保留,建议实现一定的加载卸载逻辑,并依据具体情况划分不同的.bnk文件(具体.bnk内数据的管理在Wwise编辑器内SoundBank页面)。
 
  AkAudioEvent类 作为Unreal Engine的资产对象来实现暴露Wwise的.bnk格式数据包中的Event对象,Event为一种Wwise的抽象封装对象,把实际静态的音频数据与动态的音频行为结合在一起,实现了利用消息机制来管控音频相关的播放,在使用Wwise的情况下,运行时逻辑层不再对实际的音频资源进行直接操作,而是通过对Event的控制传达消息给Wwise底层,Wwise进而通过由Wwise编辑器定义的各个Event的具体内容来进行音频相关行为。 RequiredBank变量需要手动在UE编辑器内配置,需要相同于Wwise编辑器内该Event所在的SoundBank。
 
  AkAuxBus类 作为Unreal Engine的资产对象来实现暴露Wwise的.bnk格式数据包中的 AuxBus 对象,一般用于在某些情况下需要对音频插入Bus的控制时(例如不同游戏环境下混响的变化)创建额外的这一资产,同样需要配置 RequiredBank变量。
 
  AkBankManager类 主要定义了Wwise SoundBank底层回调相关数据结构和 加载释放函数。
 
  AkComponent类 基础的Wwise组件,作为附属对象从属于某一Actor来实现诸多逻辑层功能,继承自USceneComponent因此可实例化在场景里,进而也能拥有位置信息用于3D声音相关功能。StopWhenOwnerDestroyed变量控制是否在所从属对象销毁后也一并停止声音;PostAssociatedAkEvent()函数实现向Wwise底层发出消息告知需要播放关联给该 AkComponent的Event,此时需要AkAudioEvent变量有值;也可通过PostAkEvent()直接播放某一Event;Stop()停止当前 AkComponent播放的声音;SetRTPCValue()传递某一变化的连续数值给Wwise底层,进而实现游戏参数驱动声音实时变化(例如动态天气系统相关的声音),数值与声音如何对应在Wwise编辑器内实现配置;SetSwitch()则传递离散数值给Wwise底层,用以实现不连续的声音播放逻辑变化(例如不同表面类型的脚步声音);AttenuationScalingFactor变量为3D声音衰减范围的倍率因子,由于在Wwise中定义的3D声音衰减范围不一定符合游戏需求,通过这一变量可以较为快捷地实现范围调整;SetOcclusion()函数进行简单的视线检查实现一个基础声障声笼模型。
 
  AkGameplayStatics类 定义了若干可在蓝图层面进行调用的函数,基本类同于以上几个类的成员函数, 对于SetRTPCValue()、 SetSwitch()需要注意其关联的对象将是该函数的Actor参数的根组件;SpawnAkComponentAtLocation()函数为在具体空间位置创建一个 AkComponent,常用于创建短暂的即播即销毁音效(例如武器撞击声);StartOutputCapture()相关函数可实现按照Wwise的监测文件格式输出一段时间内的具体监测数据,可在Wwise编辑器内重放用以排错调优。
 
  AkReverbVolume类 定义了一个混响体积对象,可在游戏世界内实例化,用以标识不同的混响区域,需要配置AuxBus变量,如果出现了 混响区域叠加的状况由Priority变量决定选择哪一个,同时可存在的 混响区域类型上限 在Edit-Project Settings-Wwise下可配置。
 
  AkSettings 类 定义相关全局路径配置。
 
  Interp四类 用于实现在Unreal Engine Matinee动画模块中编辑配置播放Wwise Event对象,各函数用途可参照 Matinee其他插值轨道类型,基本为增删改关键帧与播放器逻辑相关功能。