版本
Wwise Unreal Integration Documentation
|
在使用 External Source 时,要记住 External Source 及其媒体在默认情况下是分开的。设计师或开发者必须以显式方式在 External Source Cookie(本质上是一个 ShortID)和所要播放的媒体之间建立映射关系。External Source 媒体可与 SoundBank 和流媒体一起生成,但设计师必须同时追踪媒体文件及其元数据。
借助 Simple External Source Manager,可追踪 External Source 媒体并将其映射到 External Source。其使用 Data Table(.csv 文件)描述游戏中所用的 External Source 媒体,并提供 API 和 Blueprint 函数以便将媒体指派给 External Source。
注記: WwiseDemoGame 中提供有此 SubModule 的使用示例。 |
在默认情况下,会禁用 Simple External Source Manager 模块。若要启用,请将以下代码行添加到 Unreal 工程中的 DefaultEngine.ini
文件:
此代码会使用模块来覆盖 WwiseFileHandlerModule
。该模块使用 Wwise Simple External Source Manager 子模块加载 External Source。
在 Wwise Simple External Source Manager Settings 中,有两个 Data Table 和一个 Directory要设置。
Media Info Table 中的条目具有以下属性:
AkGameplayTypes.h
中的 AkCodecId
枚举值。Default Media Table 中的条目具有以下属性:
ExternalSourceCookie
匹配。用于在表格中实施查询。ExternalSourceMediaInfoId
匹配。在将 Simple External Source Manager 实例化时,其会读取 Media Info Table 并填充相应的媒体元数据列表。同时,还会填充由媒体名称到媒体 ID 的映射以用于 External Source Manager Blueprint 函数 。
接着,会读取 External Source Default Media 并将 External Source Cookie / 媒体 ID 对添加到映射。此可选 Data Table 会为 External Source 设置默认媒体以用在游戏中。藉此,可减少 Blueprint 和函数对 SetExternalSourceMedia
方法的调用次数:若已经定义默认媒体,则只需将这些方法用于 External Source 来动态更改其媒体。
在 External Source Manager 加载 External Source(通常由加载的 AkAudioEvent
触发)时,将创建 State 结构以追踪引用 External Source 的素材数量并检查该映射。若映射中存在媒体解析,则针对媒体创建 State 结构(若其已存在,则加以更新)。基于从 Media Info Table 读取的信息,要么将媒体从磁盘加载到内存中,要么注册所创建的 State 以处理来自 SoundEngine 的传入媒体请求(如进行流传输)。
若在游戏当中设置 External Source Cookie / 媒体 ID 对(比如通过 External Source Manager Blueprint 函数 设置),倘若已经加载 External Source,则立即加载媒体。若已经将 External Source 映射到不同的媒体,则该媒体的引用计数递减。若引用计数为 0,则在停止播放后将其卸载。
所有通过 AkAudioDevice 传递的 PostEvent
调用(包括来自 Integration 的 Blueprint 函数的 PostEvent 调用)都调用 External Source Manager 的 PrepareExternalSourceInfos
方法。该方法会选择要在传递的 External Source Cookie 上发送的媒体。在操作成功或失败后,会调用 BindPlayingIdToExternalSources
方法,以将所有选定媒体与所发送 Event 的 Playing ID 绑定。同样,在 Event 完成播放时,会调用 OnEndOfEvent
方法。藉此,告知 External Source Manager 该 Playing ID 已不再使用相应媒体。
最后,Cook
方法支持对 External Source 媒体进行打包。在对使用 External Source 的 Event 进行打包时,会针对每个 External Source 调用 Cook
方法。在调用此方法时,Simple External Source Manager 会将所有媒体文件暂存到其 Media Info Table 中以供打包。此操作只需执行一次,在此之后会设置标记。后续再调用 Cook
将不再执行任何操作。
注記: 若直接通过 WwiseSoundEngine API 来随 External Source 一起发送 Event,请确保在适当时机实现 External Source Manager 的 PrepareExternalSourceInfos 、BindPlayingIdToExternalSources 和 OnEndOfEvent 。否则,若在播放过程中切换 External Source 所用的媒体,可能会提前卸载之前的媒体。这可能会导致 SoundEngine 发生崩溃。在较低层级,您也可以覆盖 I/O Hook 并自行管理文件。 |
section using_features_simpleexternalsourcemanager_updating 更新 Data Table
在修改磁盘上的 Data Table 并打开 Unreal Editor 时,会对其内容进行重新解析。在此之后,将卸载并重新加载所加载的全部 Wwise Event 素材。这种粗暴的方法可确保正确更新 External Source Manager 的状态。而且,实现起来也最为简单。
为了更新 External Source 和媒体之间的映射关系,该模块提供了用来设置 External Source 媒体的 Blueprint 函数。
您可以根据个人偏好使用以下三个 Blueprint 函数来按名称或 ID 指定媒体:
MediaID
指定媒体。MediaName
指定媒体。Cookie
指定 External Source,并使用 MediaID
指定媒体。在通过字符串设置 External Source 媒体时,由名称字符串的哈希值决定 Cookie
(跟 Wwise 设计工具中一样)。通过查询解析 Media Info Table 时填充的映射中的媒体名称检索 MediaID
。
注記: Blueprint 仅可使用有符号短整数。为了规避这一限制,我们使用了 FAkUniqueID 变量来设置 External Source Cookie 值。 |
开发者可采用两种方式来通过代码设置 External Source:调用前面章节中所述的 Blueprint 函数,或者检索 External Source Manager 实例并直接调用其方法。Wwise Simple External Source Manager 中的大多数方法都是虚拟的,因此开发者可在新的模块中对此管理器进行扩展以使用自己的数据结构和逻辑来追踪媒体并与 External Source 配对。
Simple External Source Manager 设计的主要限制是 Media Info Table 对跨平台游戏来说不够灵活。不同的平台使用不同的编解码器对媒体进行解码,但 Media Info Table 的结构无法提供相应支持。其中一种潜在解决方案是在对管理器进行扩展时创建特定于平台的 Media Info Table 并根据构建目标对正确的 Media Info Table 进行打包。
When streaming, External Sources have more limitations than internally packaged media. Zero Latency is not possible with External Sources, and the prefetched data is only provided to the SoundEngine when it is requested for playback. There is a playback delay between the initial PostEvent and the actual sample processing, as would occur with any media that do not have Zero Latency.