有好几种方式在 Wwise Authoring API 中创建 Wwise 对象。
创建 Wwise 对象
利用 ak.wwise.core.object.create 和 ak.wwise.core.object.set ,可以创建大部分 Wwise 对象。如需进一步了解相关限制,请参阅 ak.wwise.core.object.create 和 ak.wwise.core.object.set 相关限制 。
理解名称冲突模式
在调用 ak.wwise.core.object.create 或 ak.wwise.core.object.set 时,可指定四种名称冲突模式之一。
如果在目标位置存在同名对象:
- fail:创建功能返回一个错误。
- replace:目标位置的原对象(及子级)被删除,新的对象被创建出来。
- rename:为新的对象自动指派一个不会重名的名称(在名称上添加数字)。
- merge:目标位置的对象被重新使用,而其指定的属性、引用和子级被合并到目标位置,对象的剩余部分不变。
了解列表和列表模式
列表是用于存储对象的通用容器。给定列表中的对象通常属于同一类型。列表方便通过 WAAPI 填充和检索被另一对象“拥有”的对象。比如,给定对象的 RTPC 包含在该对象的 RTPC 列表中。
在调用 ak.wwise.core.object.set 时,可指定两种列表模式之一。
若列表已经包含对象:
- append:在可能的情况下将新的对象添加到列表,同时保留现有对象。有些列表可能不允许存在重复的同等对象:比如,RTPC 列表中的有些 RTPC 属性是排他性的,所以只能有一个 RTPC 具有此类属性。
- replaceAll:移除所有现有对象,并添加新的对象(对重复项有限制)。
对于空白列表,行为为 append。
ak.wwise.core.object.create 和 ak.wwise.core.object.set 相关限制
Sound SFX
利用 ak.wwise.core.object.create 和 ak.wwise.core.object.set ,可以创建 Sound SFX 对象。不过存在很大的限制:
- 无法将原始 WAV 或 MIDI 文件关联到子级 Audio File Source 对象。
- 无法将语言关联到子级 Audio File Source 对象。
- 不过,可以利用 ak.wwise.core.object.set 将源插件与子级 Sound SFX 对象关联。
为此,在未来版本的 Wwise 中解除这些限制之前,建议不要使用 ak.wwise.core.object.create 和 ak.wwise.core.object.set 创建引用 WAV 或 MIDI 文件的 Sound SFX 对象。对此,请改用 导入音频文件 和 ak.wwise.core.audio.import 。
Work Unit
在使用 ak.wwise.core.object.create 和 ak.wwise.core.object.set 创建 Work Unit 之前,需要先清理撤消/重做历史记录和剪贴板。 Work Unit 会在创建的同时保存,便于在工程中快速创建对应的 WWU 文件。
onNameConflict
参数只能是 'fail'
、'merge'
或 'rename'。不支持
'replace'
模式。
Query
无法使用 ak.wwise.core.object.create 和 ak.wwise.core.object.set 创建 Query 对象。
插件
无法使用 ak.wwise.core.object.create 创建源插件、效果器插件或元数据插件。
列表
无法使用 ak.wwise.core.object.set 创建对象来填充 Metadata 和 Clips 列表。
- 无法创建元数据插件。
- 片段需要 AudioSourceRef,但其无法指定。
考虑到以下限制,建议不要使用 ak.wwise.core.object.set 在 Sequences 和 Stingers 列表中创建对象。
- 鉴于无法通过 WAAPI 将 Segment 指派给 Stinger,建议不要在 Stingers 列表中创建 Stinger。
- 鉴于无法通过 WAAPI 创建 MusicClip,建议不要在 Sequences 列表中创建 MusicSequence。
使用 ak.wwise.core.object.create 来创建一个 actor-mixer:
请参阅 ak.wwise.core.object.create 了解更多信息。
{
"parent": "{a9129d80-07e0-11e7-93ae-92361f002671}",
"type": "ActorMixer",
"name": "My Actor-Mixer",
"children": []
}
info | 备注: 想要从 Wwise 工程中获取对象 id,您可以按住 SHIFT 键同时右键单击一个对象,然后选择 Copy GUID(s) 复制到剪贴板上。 |
使用 ak.wwise.core.object.create 在属性中创建对象层级:
请参阅 ak.wwise.core.object.create 了解更多信息。
{
"parent": "{a9129d80-07e0-11e7-93ae-92361f002671}",
"type": "ActorMixer",
"name": "Weapons",
"@Volume": "-2",
"children": [
{
"type": "RandomSequenceContainer",
"name": "BigGun",
"@RandomOrSequence": "1",
"children": [
{
"type": "Sound",
"name": "Gun1",
},
{
"type": "Sound",
"name": "Gun2",
}
]
}
]
}
使用 ak.wwise.core.object.create 创建 Event
请参阅 ak.wwise.core.object.create 了解更多信息。
{
"parent": "\\Events\\Default Work Unit",
"type": "Folder",
"name": "WAAPI",
"onNameConflict": "merge",
"children": [
{
"type": "Event",
"name": "Play_SFX",
"children": [
{
"name": "",
"type": "Action",
"@ActionType": 1,
"@Target": "\\Actor-Mixer Hierarchy\\Default Work Unit\\SFX"
}
]
}
]
}
如需查看可用事件属性和动作类型列表,请参阅 Action 。
使用 ak.wwise.core.object.set 创建单个 Actor-Mixer
请参阅 ak.wwise.core.object.set 了解更多信息。
{
"objects": [
{
"object": "{a9129d80-07e0-11e7-93ae-92361f002671}",
"children": [
{
"type": "ActorMixer",
"name": "My Actor-Mixer"
}
]
}
]
}
info | 备注: object 字段指示要在工程中的哪个位置创建对象。跟大多数 Wwise 对象字段一样,object 字段支持对象 ID (GUID) 和对象路径。想要获取对象 id,请参阅 ak.wwise.core.object.get 。比如,您可以通过对象的工程路径来获取它的对象 id。 |
info | 备注: 若要从 Wwise 工程检索对象 ID,可在按住 Shift 的同时右键单击对象,然后选择 Copy GUID(s) to clipboard。 |
使用 ak.wwise.core.object.set 创建一系列带有属性的对象
请参阅 ak.wwise.core.object.set 了解更多信息。
{
"objects": [
{
"object": "{a9129d80-07e0-11e7-93ae-92361f002671}",
"children": [
{
"type": "ActorMixer",
"name": "Weapons",
"@Volume": "-2",
"children": [
{
"type": "RandomSequenceContainer",
"name": "BigGun",
"@RandomOrSequence": "1",
"children": [
{
"type": "Sound",
"name": "Gun1"
},
{
"type": "Sound",
"name": "Gun2"
}
]
}
]
}
]
}
]
}
使用 ak.wwise.core.object.set 创建 Event
请参阅 ak.wwise.core.object.set 了解更多信息。
{
"objects": [
{
"object": "\\Events\\Default Work Unit",
"children": [
{
"type": "Folder",
"name": "WAAPI",
"children": [
{
"type": "Event",
"name": "Play_SFX",
"children": [
{
"name": "",
"type": "Action",
"@ActionType": 1,
"@Target": "\\Actor-Mixer Hierarchy\\Default Work Unit\\SFX"
}
]
}
]
}
]
}
],
"onNameConflict": "merge"
}
如需查看可用 Event 属性和 Action 类型列表,请参阅 Action 章节。
使用 ak.wwise.core.object.set 在 RTPC 列表中创建带有曲线的 RTPC 并绑定 Custom Control Input
请参阅 ak.wwise.core.object.set 了解更多信息。
{
"objects": [
{
"object": "\\Actor-Mixer Hierarchy\\Default Work Unit\\My Sound",
"@RTPC": [
{
"type": "RTPC",
"name": "",
"@Curve": {
"type": "Curve",
"points": [
{ "x": 100.0, "y": -20.82785, "shape": "Linear" },
{ "x": 10000.0, "y": 21.8509, "shape": "Linear" }
]
},
"notes": "Property: OutputBusLowpass, ControlInput: RPM",
"@PropertyName": "OutputBusLowpass",
"@ControlInput": {
"type": "ModulatorLfo",
"name": "RAND",
"@LfoWaveform": 5
}
}
]
}
]
}
使用 ak.wwise.core.object.set 在多个父对象下一并创建对象
请参阅 ak.wwise.core.object.set 了解更多信息。
{
"objects": [
{
"object": "{a9129d80-07e0-11e7-93ae-92361f002671}",
"children": [
{
"type": "ActorMixer",
"name": "My Actor-Mixer"
}
]
},
{
"object": "{a9129d80-07e0-11e7-93ae-92361f002671}",
"children": [
{
"type": "ActorMixer",
"name": "Weapons",
"@Volume": "-2",
"children": [
{
"type": "RandomSequenceContainer",
"name": "BigGun",
"@RandomOrSequence": "1",
"children": [
{
"type": "Sound",
"name": "Gun1"
},
{
"type": "Sound",
"name": "Gun2"
}
],
"@RTPC": [
{
"type": "RTPC",
"name": "",
"@Curve": {
"type": "Curve",
"points": [
{ "x": 100.0, "y": -20.82785, "shape": "Linear" },
{ "x": 10000.0, "y": 21.8509, "shape": "Linear" }
]
},
"notes": "RTPC on BigGun. Property: OutputBusLowpass, ControlInput: RPM",
"@PropertyName": "OutputBusLowpass",
"@ControlInput": "{E31BAE21-CFA6-4655-81F6-E6FBDC802E9D}"
}
]
}
]
}
]
}
]
}
使用 ak.wwise.core.object.set 设置 Name、Notes、属性和对 Object 的引用
请参阅 ak.wwise.core.object.set 了解更多信息。
{
"objects": [
{
"object": "\\Actor-Mixer Hierarchy\\Default Work Unit\\MySound",
"name": "new name",
"notes": "This object's notes are set.",
"@Volume": 5.7,
"@OutputBus": "\\Master-Mixer Hierarchy\\Default Work Unit\\Master Audio Bus\\Environment Bus"
}
]
}
使用 ak.wwise.core.object.set 为新建的 Custom RoomVerb 效果器插件设置声音的 Effect0
请参阅 ak.wwise.core.object.set 了解更多信息。
{
"objects": [
{
"object": "\\Actor-Mixer Hierarchy\\Default Work Unit\\MySound",
"@Effect0": {
"type": "Effect",
"name": "myCustomEffect",
"classId": 7733251,
"@PreDelay": 24,
"@RoomShape": 99
}
}
]
}
导入音频文件
音频文件可以通过 Audio File Importer(音频文件导入器) 用制表符分割导入中同样可用的导入处理器, 使用 Wwise Authoring API 导入。
使用 Wwise Authoring API 能做到导入过程的完全自动化,同时您可以用自己选择的编程语言来直接控制。
导入格式非常灵活。您可以导入:
简单来说,音频文件导入过程中允许:
- 导入和本地化音频文件
- 自动创建 Actor-Mixer 层级结构
- 创建 Event(事件)
- 指派属性值,如 Volume(音量)
- 指派引用,如 Output Bus(输出总线)
有关此功能的详情,请参阅 https://www.audiokinetic.com/library/edge/?source=Help&id=importing_media_files_from_tab_delimited_text_file。
示例:
导入一个 WAV 文件,并创建关联的 Sound 对象。
使用 ak.wwise.core.audio.import 导入音频文件
请参阅 ak.wwise.core.audio.import 了解更多信息。
导入多个 Sound SFX:
{
importOperation: "createNew",
default: {
importLanguage: "SFX"
},
imports: [
{
objectPath: "\\Actor-Mixer Hierarchy\\Default Work Unit\\<Sound>MyNewSound1",
audioFile: "C:\\sources\\1.wav",
"@Volume": 0.42
},
{
objectPath: "\\Actor-Mixer Hierarchy\\Default Work Unit\\<Sound>MyNewSound2",
audioFile: "C:\\sources\\2.wav",
"@Volume": 0.1
}
]
}
在同一 Sound SFX 对象中导入多个 Audio Source。注意,为确保在转为活跃状态时将 Audio Source 排在第一位,向其中一个 Audio Source 添加了下划线前缀:
{
importOperation: "replaceExisting"
default: {
importLanguage: "SFX"
},
imports: [
{
audioFile: "D:\\sources\\Version1.wav",
objectPath: "\\Actor-Mixer Hierarchy\\Default Work Unit\\<Sound SFX>MySound\\<AudioFileSource>_MyActiveSource"
},
{
audioFile: "D:\\sources\\Version2.wav",
objectPath: "\\Actor-Mixer Hierarchy\\Default Work Unit\\<Sound SFX>MySound\\<AudioFileSource>OtherSource"
}
]
}
使用 ak.wwise.core.audio.import 本地化音频文件
请参阅 ak.wwise.core.audio.import 了解更多信息。
以 English 形式导入 Sound Voice:
{
importOperation: "useExisting",
default: {
importLanguage: "English(US)"
},
imports: [
{
objectPath: "\\Actor-Mixer Hierarchy\\Default Work Unit\\<Sound>MyVoice",
audioFile: "C:\\sources\\en\\Hello.wav"
}
]
}
以 French 形式本地化 Sound Voice:
{
importOperation: "useExisting",
default: {
importLanguage: "French"
},
imports: [
{
objectPath: "\\Actor-Mixer Hierarchy\\Default Work Unit\\<Sound>MyVoice",
audioFile: "C:\\sources\\fr\\Hello.wav"
}
]
}
在同一 Sound Voice 中同时导入多个不同语言的 Audio Source:
{
importOperation: "useExisting",
imports: [
{
audioFile: "D:\\sources\\hello_en.wav",
objectPath: "\\Actor-Mixer Hierarchy\\Default Work Unit\\<Sound Voice>hello\\<AudioFileSource>hello_en",
importLanguage:"EN_US"
},
{
audioFile: "D:\\sources\\hello_fr.wav",
objectPath: "\\Actor-Mixer Hierarchy\\Default Work Unit\\<Sound Voice>hello\\<AudioFileSource>hello_fr",
importLanguage:"FR_CA"
}
]
}
info | 备注: 确保工程中存在相应语言且大小写匹配。 |