版本
Wwise Unreal Integration Documentation
|
开发者可将 External Source 与 Wwise 声音对象关联来动态调节与源关联的媒体。External Source 可在运行时提供声音数据。
为此,开发者可能会想构建自己的系统来决定要加载的媒体及其加载方式和时机。External Source Manager 的设计考虑到了这一点。它提供有高度可扩展的基类,其包含大部分用于追踪 External Source 及其媒体的样板实现,不过需要通过扩展来定义实际的加载行为。
Integration 包含名为 Wwise Simple External Source Manager 的 Wwise External Source Manager 示例扩展。它支持基本的 External Source 管理,可为想自行构建管理器的开发者提供参考。有关详细信息,请参阅 使用 Wwise Simple External Source Manager 章节。
您可以在 Wwise 设计工具内的 Project Settings 对话框的 External Sources 选项卡中设置 External Source 的生成路径。Refer to Specifying the Input/Output Locations for External Sources for more information.
External Source 是个空的容器。游戏必须为其填充内容并告知声音引擎其中包含什么。
External Source 使用类似于 ShortId 的 Cookie 作为标识符。若要获取 Cookie,请对在源的 Contents Editor 中为 External Source 插件指定的名称进行哈希处理。有关详细信息,请参阅 Contents Editor:Wwise External Source。
在将使用 External Source 的 Event 发送到 SoundEngine 时,必须通过其传递一组 AkExternalSourceInfo 结构来识别要用于各个 Cookie 的媒体。这些媒体可加载到内存中,也可进行流传输。游戏须确保在发送 Event 时准备好这些资源。
有关 External Source 的详细信息,请参阅以下主题:
有关 External Source 转码的更多详细信息,请参阅集成 External Source。
External Source 具有以下几个显著特性:
鉴于 Event、External Source 和 Media 之间的复杂关系,Wwise External Source Manager 负有以下几项职责:
AkExternalSourceInfo
结构以调用 PostEvent。若要实现自定义 Wwise External Source Manager,必须先创建一个新的 Unreal 模块。该模块至少要包含两个类:
FWwiseExternalSourceManager
,负责履行上节中所列的职责。FWwiseExternalSourceManager
包含定义 External Source 所需的纯虚拟接口。在特殊情况下,工程可将此定义为其继承点,并完全控制 External Source 管线。FWwiseExternalSourceManagerImpl
具有在运行时加载和卸载 External Source 所用媒体所需的各种函数。它包含由 External Source Cookie 到媒体 ID 的映射,可处理 I/O 操作并追踪媒体的生命周期。通过继承该类,可简化自定义追踪操作和打包的实现。FWwiseExternalSourceManagerImpl
类可自行处理复杂的 I/O 详细信息。FWwiseSimpleExtSrcModule
用作父类,因为它是可扩展的。FWwiseFileHandlerModule
,负责覆盖 InstantiateExternalSourceManager
以返回第一个类的实例。在此之后,若要启用模块,可将 WwiseFileHandlerModuleName
设为 DefaultEngine.ini
文件的 [Audio]
部分中的新模块的名称。有关详细信息,请参阅 启用 Simple External Source Manager 章节。
Wwise External Source Manager 是 WwiseFileHandler
模块中的接口。在加载使用 External Source 的 Wwise Event 素材时,WwiseResourceLoader
模块会将 Event 的 CookedData
(参见 Wwise Unreal 素材 章节)中的信息传给 WwiseFileHandler
,然后将资源加载委托给 Wwise External Source Manager Implementation。后续操作取决于实现本身。
在默认实现中,External Source Manager 会创建 FWwiseExternalSourceState 结构以供追踪 External Source。基于具体的实现和可用信息,会加载媒体或准备进行流传输。同样,在加载 Event 素材时,会告知 External Source Manager 并相应地更新 External Source 的状态。此行为履行 External Source Manager 的第一项职责(追踪 External Source 的状态),其在以下函数中实现:
AkExternalSourceInfo
以便播放 External Source。LoadExternalSourceImpl
的调用。UnloadExternalSourceImpl
的调用。LoadExternalSourceMedia
。UnloadExternalSourceMedia
。第二项职责(填充 AkExternalSourceInfo 结构)由 PrepareExternalSourceInfos
履行。对此,将返回 PostEvent
External Source 参数。它会检索 CookieToMedia
中的数据,使用该信息来定义不同的文件状态,并提供所需的 AkExternalSourceInfo
以便发送 Event。若要使用更为复杂的选择算法,可将其覆盖。
在 Wwise Simple External Source Manager 扩展中,有个固定的 MediaInfo
DataTable,其用于识别工程中的所有 External Source 媒体及相关元数据。您可以采用更为高级的系统来动态更新已知媒体列表。因为有很多不同的方式来实现此类系统,所以所有操作都可以虚拟化。您可以创建相应的代码来让 Random Container 更改每一 PostEvent,或者根据外部状态(如语言变化)来更改结构。
为了履行下一组职责(追踪所加载媒体的状态、追踪与 External Source 的映射关系、从磁盘进行加载),FWwiseExternalSourceManagerImpl
类会追踪已知 External Source 媒体以及加载它们所需的信息。这种状态追踪通过 ExternalSourceStatesById
映射在内部完成。
在实现前面所说的系统和结构后,建议实现以下虚函数:
FWwiseFileHandlerBase
继承的方法来追踪媒体加载状态,并使用 FWwiseExternalSourceFileState 结构来管理媒体资源。SetExternalSourceMedia
函数假定各个 External Source 媒体具有唯一的 ID。对于 SetExternalSourceMediaByName
,则可通过名称来检索媒体 ID。建议将 Wwise Simple External Source Manager 作为这些函数的参考,因为实现很可能仅在如何存储、更新和检索由 External Source 到媒体的映射上有所不同。记住,External Source 和媒体文件之间映射关系的动态变化可能会导致资源被加载和卸载。
目前的实现会将这些视为阻塞函数,并可能通过 Game Thread 来运行。不过,这并不是必需的。
警告: 强制卸载正在播放的 External Source 媒体会导致 SoundEngine 发生崩溃。对此, FWwiseExternalSourceFileState 可通过 BindPlayingIdToExternalSources 和 OnEndOfEvent 方法逐渐减少和增加其播放次数来自动处理这一问题。 |
在完成目前为止讨论的各种函数的实现后,External Source Manager 最复杂的部分就完成了。倘若一切正常,可通过加载 Event 素材或采用系统对 External Source 的准备方式,来将 External Source 所用的媒体加载到内存中或准备进行流传输。
最后,必须对 External Source 媒体进行打包。简单来说,可在 Unreal 工程中生成 External Source 媒体,并将其保存到被设为始终烘焙的目录。若要实现更为复杂的打包逻辑,请覆盖 External Source Manager 的 Cook 方法。Wwise Resource Cooker 会针对已烘焙 Wwise 素材中包含的每个 External Source 调用该方法。
除此之外,还提供以下可覆盖函数:
在默认情况下,会在 WwiseExternalSourceStatics 中暴露三个 Blueprint 函数。
这些函数会调用 External Source Manager 扩展中定义的对应函数。有关详细信息,请参阅 External Source Manager Blueprint 函数 章节。
默认在 WwiseExternalSourceManagerImpl
中使用该结构来获取所加载 External Source 的引用计数。
Wwise Simple External Source Manager 使用该结构来处理媒体资源。状态可追踪引用计数以及其当前是否正在播放。卸载正在播放的 External Source 媒体会导致 SoundEngine 发生崩溃。 您可以通过两个子类来处理加载到内存中或进行流传输的媒体。
FWwiseFileHandlerBase
基类对自身进行注册。在将要对媒体进行流传输的请求传给 External Source Manager 时,会检索注册的 FileState 并由其处理后续 I/O 请求。