在《人人都能用WAAPI(三)》中,我们会继续上一篇的内容,讨论WAAPI的Functions(执行类)中剩下的其他的API及Topics(订阅类)。
把API逐条列出讲解是为了快速阐述其功能,补充文档的一些不足,以帮助大家快速对WAAPI建立印象,并非重写参考文档。所以建议看完本文后按照第一篇文中所提的方法,用自己喜欢的整理方式重新整理一次。
本文并不会把每个参数全都翻译并复述一遍功能,这里均假设读者已学会了概述中的JSON阅读方法,能够自行根据我的介绍查阅WAAPI参数及返回值等文档信息,此外还希望读者能准确的找到在线文档中对应的章节。
为了照顾初学者,我尽量把注释写到每一行,以便快速入门。
因为WAAPI的功能也是随版本更新逐渐添加的,建议安装最新版Wwise进行操作。当报错信息提示“TheprocedureURIisunknown.”时,就代表你的当前WAAPI版本并不支持此API。
wwise.ui、wwise.waapi、wwise.debug概览
wwise.ui、wwise.waapi、wwise.debug这几个小分类是执行类里比较简单的部分,功能分别为UI控制操作功能、WAAPI的反射功能及Debug功能。
bringToForeground,captureScreen,getSelectedObjects(窗口操作、截图、获取选中对象)
bringToForeground能够把当前Wwise窗口前置,注意这个功能只在Windows下才有效。
captureScreen可以对当前Wwise工程进行截图,如果不进行参数的话。指定默认会截取整个视图。通过其中的rect参数可以设置截图的xy轴起始点及宽度高度。如果想截取指定的View,可以在viewName中进行指定,同时可通过viewSyncGroup指定获取View中的SyncGroup。
对于刚才提到的操作,我们可在Options中添加id参数,即可在调用这个API的时候获得GUID返回值。这个功能与ak.wwise.core.object.get能获取的数据种类是完全一样的。想获得更为便捷的信息获取工作流,也可以通过命令扩展功能把脚本调用整合到右键菜单上。
project.open,project.close(读取工程与关闭工程)
通过project.open可以打开指定的工程,为此需要传入path参数。此外还可设置bypassSave来决定是否提示用户保存当前工程。
在project.close也是同理,可通过bypassSave决定是否提示用户保存当前工程。如果设定为False,会直接关闭工程。
commands的execute是个更“直接”的命令执行功能。
在上一篇中我们提到当想达到一个具体的需求时要先找到对应的API,再按文档要求调用API以实现它的功能。但如果我们想完成一些简单的需求,比如Wwise本身在软件页面上就有的一些功能。这种方法无疑是很麻烦,远不如一个快捷键来的方便。
举个例子,如果我们在自己做的工具想一键生成所有SoundBank,按上一篇文中的方法应该怎么做?注意generate是没有功能去生成所有SoundBank的。所以想用这个API实现需求,我们就必须先获取所有SoundBank的名称或GUID,再作为参数反复调用API以让其逐个生成SoundBank,这无疑是笨拙且低效的。
与WAAPI的绝大多数执行过程不同,这种调用方法是会显示出窗口的,参数中也没有方法让其静默工作。本质上就是代替我们完成了点击操作,但却极大的扩展了WAAPI对于简单命令的执行能力。
getCommands可以看到当前版本平台支持的所有命令,但它比WwiseAuthoringCommandIdentifiers中所列出命令的会更多,可优先作为使用时的参考。
commands.register,commands.unregister(命令扩展的注册与注销)
register和unregister,看名字容易看出它们的功能是注册与注销,它们所控制的是Wwise的另一个进阶功能,即命令扩展(用户自定义的命令)的注册与注销。
命令扩展(CommandAdd-ons)是在Wwise中添加自定义的功能的一种方法,此功能可以增加到菜单中,可以用上一小节提到的execute命令执行,也可映射到控制器或快捷键上。
思考一个应用场景,你想对已导入的音频进行稍微复杂点的编辑,这时可能需要打开DAW或音频剪辑工具改完后再重新替换Wwise中的源文件,这显然比较麻烦。但通过命令扩展功能,就可以在Wwise中给音频源的菜单中增加直接调用Audacity的功能,如果再给Audacity传递一些预定义参数,让其自动对我们所选的文件进行读取操作以便于编辑。
除了执行程序外,命令扩展也可以调用脚本。因为绝大多数音频设计的工作还是要面对Wwise本身的界面的,所以一些WAAPI功能脚本做好后我们可以嵌入到Wwise的菜单中,这样在工作中更加方便。
回到register和unregister的功能上,其实它们就是通过WAAPI来进行注册和注销命令扩展(其余的定义命令扩展方法是要在几个路径下的Add-ons\Commands目录中添加JSON配置参数来完成的)。对此,技术音频设计师或许可以给用户封装一个自定义添加功能菜单的程序,调用register来进行用户定义功能的菜单添加。这样能够实现更加私订制化的的工作流实现。
应用场景
对于bringToForeground,captureScreen,getSelectedObjects三个API而言,其中getSelectedObjects在快速获取对象的指定信息上非常便利,简化了get中的一部分功能,有效提升了效率。
对于使用Metagrid和StreamDeck来提升效率的用户来说,此时可以通过快捷键、commands.execute及WAAPI功能脚本三者进行功能部署,把工作流提升到最大化。
getFunctions,getSchema,getTopics(获取WAAPI有关信息)
WAAPI中的waapi类下面的三个是API反射函数,功能都是获取WAAPI有关信息。
getFunctions能够获取当前所有可用的Functions(执行类)API,getTopics则是获取当前所有可用的Topics(订阅类)API。
getSchema以WAAPIURI作为参数,能够返回URI对应的各种Schema。注意此API因参数冲突问题,Python用户需更新waapi-client0.5及后续版本才可正常工作。
对于不允许工作电脑联网的公司,如果没有下载WwiseSDK文档,可用这种方法在离线时查询WAAPI有关参数和使用方法。
enableAsserts,enableAutomationMode,testAssert,testCrash
enableAutomationMode为启用自动化模式,可减少自动化任务过程中由消息框和对话框造成的潜在中断。在大量的自动化工作中可以打开此选项,此时Wwise的界面也会变成炫酷的暗红色调。
enableAsserts为断言开关,testAssert用来在DebugBuilds中测试断言。订阅类的ak.wwise.debug.assertFailed功能亦会返回断言失败时的具体信息。使用这个功能前需要知道,WwiseSDK提供Debug、Profile和Release三个版本,日常的开发工作主要面对Profile版,Release版本则用于最终的游戏发行版。Wwise提供的断言测试功能,只能在Debug(调试)版本中使用。
testCrash为崩溃时用来Debug的功能。
soundengine是执行类中的第二大分类,可以直接对声音引擎进行操作。如果曾翻阅过WwiseSDK,我们很容易发现soundengine的大部分API在其中都以同名出现过。也就是说,WAAPI将这一部分常用功能从WwiseSDK中暴露了出来,提供了另一种控制声音引擎的方法。
因为是对声音引擎的各种属性进行操作,所以这些API几乎都需要用户提供注册后的GameObject的GUID作为参数,以明确到底要对哪个操作对象进行控制。
在Wwise中GameObject是最核心的概念之一,只有把游戏引擎中的发声体与GameObject绑定,Wwise才能知道到底要对为游戏中的哪个对象发声、设置位置、朝向等。
registerGameObj,unregisterGameObj(游戏对象注册与注销)
除了在游戏引擎中通过预制脚本或直接引用WwiseSDK注册外(这两者都是使用了AK::SoundEngine::RegisterGameObj()进行GameObject注册),我们也可通过WAAPI来进行GameObject的注册管理。
registerGameObj与unregisterGameObj分别负责注册与注销WwiseGameObject,其中registerGameObj需要提供GameObject的ID与名称,unregisterGameObj只需GameObjectID即可注销对象。
executeActionOnEvent,postEvent,postTrigger,postMsgMonitor,seekOnEvent(执行与发送)
postMsgMonitor在本系列文的第一篇概述中曾用来输出“HelloWwise!“字符串,它的功能只有一条,即把传入的信息输出到Profiler的CaptureLog中。
postEvent在提供GameObjectID与EventID后可在特定的GameObject上触发Event。
postTrigger可在InteractiveMusic中手动触发Stinger,与在Wwise中设置的Trigger触发效果相同。
executeActionOnEvent可对特定GameObject上的Event执行Action,必备参数除了gameObject,event,actionType用来决定操作对象和行为类型之外,还可用fadeCurve(过度时的曲线类型),transitionDuration(过度时长)来为Event增加播放淡变。
stopAll,stopPlayingID(停止播放)
stopAll可以停止特定游戏对象上播放的声音,因此需要gameObject指定被停止的游戏对象。如果该游戏对象不存在,那么所有声音都会被停止。
setDefaultListeners,setListeners,setListenerSpatialization,setGameObjectAuxSendValues,setGameObjectOutputBusVolume,setPosition,setMultiplePositions,setObjectObstructionAndOcclusion,setScalingFactor(各种属性设置)
setDefaultListeners可置默认的听者,之后所有新注册的游戏对象都会以此作为听者。需要提供作为listeners(听者)的GameObject。
setListeners可为单一发声体对象的设置听者,为此需要提供作为listeners(听者)和emitter(发声体)的GameObject。
setListenerSpatialization用来设定听者的空间化参数,对不同声道设置音量偏置。需要提供listener(听者的GUID),volumeOffsets(每个声道的偏置值),spatialized(空间化开关),channelConfig(声道构造)。
setGameObjectOutputBusVolume设定指定发声体GameObject的OutputBus音量,需提供emitter(需要被调整音量的发声体对象),listener(听者对象),controlValue(使用数值更改音量,0为静音,0-1为衰减量,1往上为增加量)。
setPosition用来设置GameObject的位置,需要提供gameObject(游戏对象)和position(位置参数)。其中位置参数包括orientationTop(Listener头的斜度),position(Listener的坐标),orientationFront(Listener头部的朝向)。
setMultiplePositions可以为一个发声体设置多个位置,预制脚本AkAmbient中的多点定位就是用SDK中它所对应的API实现的。参数除了gameObject(游戏对象)之外,还需要提供multiPositionType(多点定位模式),positions(听者的位置和朝向)。
setObjectObstructionAndOcclusion用来设置对象的声障和声笼级别,需要listener(听者)和emitter(发声体)及obstructionLevel(声障级别),occlusionLevel(声笼级别)。
setScalingFactor用来设置GameObject的缩放因子,可用来缩放衰减计算的范围。需要提供gameObject(游戏对象),attenuationScalingFactor(衰减因子)。
setState,setSwitch,setRTPCValue,resetRTPCValue(GameSync设置)
setState用来设置StateGroup中的State,需要提供参数state,stateGroup。
setSwitch用来设置SwitchGroup中的SwitchState,需要提供参数gameObject,switchGroup,switchState。
setRTPCValue用来设置RTPC为指定值,需要参数gameObject,rtpc(RTPC对象),value(RTPC数值)。
resetRTPCValue可以重置RTPC为默认值,需要参数gameObject,rtpc。
对于此分类下的API来说,绝大多数都是从WwiseSDK中暴露出来的功能,因此可知其使用场景多为需手工操作声音引擎属性时,例如引擎中的游戏运行时手工进行游戏对象注册注销、属性修改等。
与Functions(执行类API)相同,Topics(订阅类API)中最大的功能模块也是wwise.core。
在开始前请注意这些API的一个共同点,它们的可选的Options中绝大多数存在两个公用选项。其一是platform(平台),另一个是通过return设置的Wwise对象内置的存取器提供的诸多标准属性(可参考文档中有关“built-inaccessorsforWwiseobjects”的描述,以下简称为“基本信息”)。
created,preDeleted,postDeleted
created可在工程中有对象被创建时,发布此对象被订阅的信息。具体的信息类型需要使用Options参数指定,如果此参数留空,发布的信息中只会包含object基本信息(包括GUID与对象类型)。
childAdded,childRemoved
childAdded与childRemoved订阅了父对象(容器对象)中子对象的状态,当子对象被添加或移除时,会发布订阅的信息类型。
它们需要提供Options参数,来决定发布的信息中返回哪些对象信息类型。当不提供Options参数时,默认只会返回parent(父对象)和child(对象的基本信息)。
attenuationCurveChanged,attenuationCurveLinkChanged
attenuationCurveChanged可订阅对象的衰减曲线的使用情况,但这个改变情况并非指衰减曲线本身(分割点位置、曲线类型)的变化,而是AttenuationEditor中衰减曲线的使用状态。
attenuationCurveLinkChanged订阅了衰减曲线在不同平台下的Link情况。
我进行了多次测试,发现实际使用中这两者的功能相同,都会响应彼此的设计功能而发布相同的返回信息,因此这两个API可以混用。它们的可选Options参数中可设定所需的对象的基本信息。
curveChanged,nameChanged,notesChanged
curveChanged可订阅对象属性曲线发生改变的情况,并不会返回曲线改变了多少。如不指定Options,默认会返回owner(被修改的对象)和curve(被修改的曲线对象)的基本信息。
nameChanged可订阅对象名称的变化,如不指定Options,默认会返回oldName(修改前的对象名),newName(修改后的对象名),object(对象的基本信息)。
notesChanged可订阅对象备注的变化,如不指定Options,默认会返回oldNotes(修改前的备注),newNotes(修改后的备注),object(对象的基本信息)。
propertyChanged,referenceChanged
propertyChanged可订阅对象的属性发生改变的具体情况,它也是wwise.core.object订阅子类中唯一需要提供必须参数的API,Options中必备的参数有property(被修改的属性名)和object(对象名或GUID)。同时也指定基本参数来决定发布信息的返回值。默认情况下会返回property(被修改的属性名),object(对象的基本信息),old(之前的属性值),new(新的属性值),platform(被修改属性值所在的平台)。
referenceChanged用来订阅对象引用发生变化的情况,如不指定Options,默认会返回old(之前的引用对象),new(之的的引用对象),object(引用被修改的对象),reference(被修改的引用对象的名字)。
loaded,saved
loaded可在工程被正确加载后发布信息,无需参数,这个API指的是通过菜单打开工程或ak.wwise.ui.project.open打开工程并加载完成后才会发布消息。
saved可在工程保存后发布被修改文件的路径消息,它所返回的modifiedPaths很详细,每个被修改的wwu文件和工程内文件的的路径都会被返回。
preClosed,postClosed
preClosed和postClosed分别可在工程开始关闭和关闭完成时发布消息,注意这个关闭指的是通过Crtl+F4快捷键或ak.wwise.ui.project.close来关闭的工程,并不是点击窗口关闭按钮去关闭整个Wwise。
generated,generationDone
assignmentAdded,assignmentRemoved
assignmentAdded和assignmentRemoved可以订阅SwitchContainer中指派的添加与移除,它们两者可选的Options与可发布的信息完全一致,在这里放在一起讨论。
在Options中如果不指定需返回的SwitchContainer和指派对象的基本信息时,这两个API默认都只会返回stateOrSwitch(子对象指派到了Switch还是State中,并返回它的信息),switchContainer(容器本身的信息),child(被指派到容器内对象的有关信息)
stateChanged
stateChanged可订阅走带对象的状态变化,必须用Options提供transport(走带对象的GUID)。当状态改变,会发布transport(正在订阅的走带对象的GUID),object(被走带对象所控制对象的GUID),state(走带播放状态)。
imported
imported可订阅音频导入操作完成后的消息,可选的Options中可设定每个被导入对象所要返回的基本信息。
itemAdded
itemAdded可订阅日志中条目的增加,不需要指定Options,在发布信息中可以返回channel(可返回Log窗口中选项卡的名称),item(选项卡内具体新增的条目,如time,severity等)。
assertFailed(订阅资源失败信息)
assertFailed只在Debug版本下可用,会返回fileName(原文件名),lineNumber(代码行数),expression(错误注释)。
commands.executed,selectionChanged(订阅命令执行状态与选择改变)
commands.executed可订阅有命令被执行,可选的Options中除了设定对象的基本信息外,还可设定platform(平台)和language(语言)。默认情况下会返回platform(平台),objects(被执行对象的基本信息),command(被执行命令的ID)。这条API不只响应通过ak.wwise.ui.commands.execute所执行的命令,用户正常执行的操作也会有响应,因此可用作查看当前命令是否在WwiseAuthoringCommandIdentifiers受支持的验证工具。
selectionChanged可工程中选中对象的变化,只对ProjectExplorer和EventViewer这种含有条目的有效,对调整选项无效。可选的Options中同样可以指定platform(平台)和language(语言),返回值只会返回object(被选中对象的基本信息)。
wwise.ui、wwise.waapi、wwise.debug中的功能非常简单。
但soundengine中关于GameObject注册的部分可能让初学者难以理解,因为通常游戏对象的管理都是通过集成包自动完成的,例如在Unity中会有AkGameObj脚本来调用SDK中的RegisterGameObj和UnregisterGameObj来帮我们注册或注销GameObject,无需用户亲自介入。
如果在WAAPI使用时想要通过ak.soundengine.registerGameObj手动注册GameObject,可参考预制脚本中的注册流程,如参考集成包内的GetAkGameObjectID方法把游戏对象标识符转为int64从而传入API注册游戏对象。
对订阅Topics类API来说,所有的调用都是需要回调函数来指定返回值的。之所以这样设计,是因为订阅执行后程序会阻塞并等待返回值,并不像执行类API调用一次就结束程序。
对于订阅类API来说,因为调用时会阻塞,所以如果想同时让程序做别的功能,可把这部分调用放入多线程。
另外,作为对文档的补充,我们会展开讨论如何在常见的游戏引擎中调用WAAPI。