版本
menu_open
警告:系统已根据您所用大版本 (2021.1.14.8108) 自动跳转至最新文档。若想访问特定版本的文档,请从 Audiokinetic Launcher 下载离线文档,并在 Wwise 设计程序中勾选 Offline Documentation 选项。
Wwise Unity Integration Documentation
Wwise Addressables 示例

Wwise Addressable Asset Metadata Preserver

在使用 Wwise Addressables 素材时,要想确保更新 WwiseAddressableBank 素材,最简单的方法是删除生成的 SoundBanks 文件夹并重新生成 SoundBank。在删除 Addressables 素材时,会清除 Addressables 分组的内容。在重新导入时,其父组和标签将会丢失。Wwise Unity Addressables Package 中包含的这个示例脚本提供相应功能来保留 Addressables 素材元数据(如父组和标签)。

工作原理

我们添加了一项可选设置可供启用来帮助恢复丢失的分组和标签。该设置可在 Unity 工程设置的 Wwise Addressables 下找到。在启用后,可指定元数据的目标目录。此目录应设在 Unity 工程的 Assets 文件夹内。

WwiseAssetMetadataPreserver 脚本会在 Assets/Wwise/Addressables 下添加一个菜单触发器,以便保存工程中所有 Wwise Addressables 素材的元数据。在触发时,会针对每个 Wwise Addressables 素材创建 AddressableMetadata 素材,并将父组和标签的名称序列化。脚本还会通过 WwiseBankPostProcess.GetAssetMetadataDelegate 函数对自身进行注册。此委托允许外部代码在通过 WwiseBankPostProcess 自定义导入器导入时填入用于设置素材字段的元数据结构。该导入器会在添加到 Unity 工程时导入 .bnk 和 .wem 文件。

借助这两种机制,可在执行清理前将素材元数据序列化,并在生成 Soundbank 后重新导入时重新应用于素材。

备注:

此脚本只是为了展示如何做到这一点。您可以根据自身制作要求来编写元数据填入代码。

示例代码

#if AK_WWISE_ADDRESSABLES && UNITY_ADDRESSABLES
using UnityEditor.AddressableAssets;
using UnityEditor.AddressableAssets.Settings;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using System.IO;
namespace AK.Wwise.Unity.WwiseAddressables
{
/*
此类提供相应功能来保留并恢复 Wwise Addressables 素材分组和标签元数据。
在删除素材时,此信息会丢失。要想修复损坏的 WwiseAddressableSounbanks,最简单的方法是清除 Wwise Addressables 素材文件夹。
此类只是为了展示如何实现这一功能,并不是一个完善的解决方案。
*/
[InitializeOnLoad]
class WwiseAddressableAssetMetadataPreserver
{
static WwiseAddressableAssetMetadataPreserver()
{
if (AkAddressablesEditorSettings.Instance.UseSampleMetadataPreserver)
{
BindMetadataDelegate();
}
}
//在 WwiseBankPostProcess AssetPostProcessor 上设置 GetAssetMetadataDelegate(处理 .bnk 和 .wem 文件的导入)
public static void BindMetadataDelegate()
{
WwiseBankPostProcess.GetAssetMetadataDelegate += GetMetadata;
}
//取消设置委托(在禁用功能时)
public static void UnbindMetaDataDelegate()
{
WwiseBankPostProcess.GetAssetMetadataDelegate -= GetMetadata;
}
为每个 Wwise Addressables 素材创建 AddressableMetadata 素材来追踪分组和标签。
//按照与 Wwise 素材匹配的层级结构来在对应文件夹下创建元数据素材
//文件夹层级结构和素材名称用于在导入时与素材进行匹配
[UnityEditor.MenuItem("Assets/Wwise/Addressables/Serialize addressable asset metadata")]
public static void PreserveAllWwiseAssetMetadata()
{
AddressableAssetSettings addressableSettings = AddressableAssetSettingsDefaultObject.Settings;
foreach (AddressableAssetGroup group in addressableSettings.groups)
{
foreach (AddressableAssetEntry assetEntry in group.entries)
{
if (assetEntry.MainAsset)
{
if (assetEntry.MainAsset.GetType().IsSubclassOf(typeof(WwiseAsset)))
{
CreateMetadataAsset(assetEntry.AssetPath, assetEntry.labels, group.name);
}
}
}
}
}
[UnityEditor.MenuItem("Assets/Wwise/Addressables/Preserve addressable asset metadata", true)]
public static bool ValidatePreserveAllWwiseAssetMetadata()
{
return AkAddressablesEditorSettings.Instance.UseSampleMetadataPreserver;
}
//创建必要的子文件夹和元数据素材
public static void CreateMetadataAsset(string assetPath, HashSet<string> assetLabels, string groupName)
{
string soundbankPath = assetPath.Replace(AkAssetUtilities.GetSoundbanksPath(), "");
var splitBankPath = soundbankPath.Split('/');
AddressableMetadata metaDataAsset = ScriptableObject.CreateInstance<AddressableMetadata>();
metaDataAsset.labels = new List<string>(assetLabels);
metaDataAsset.groupName = groupName;
var rootPath = AkAddressablesEditorSettings.Instance.MetadataPath;
if (!Directory.Exists(Path.Combine(Application.dataPath, rootPath)))
{
UnityEditor.AssetDatabase.CreateFolder("Assets", rootPath);
}
for (int i = 1; i < splitBankPath.Length - 1; i++)
{
if (!Directory.Exists(Path.Combine(Application.dataPath, Path.Combine(rootPath, splitBankPath[i]))))
{
AssetDatabase.CreateFolder(Path.Combine("Assets", rootPath), splitBankPath[i]);
}
rootPath = Path.Combine(rootPath, splitBankPath[i]);
}
string assetMetadataPath = Path.Combine("Assets", rootPath, Path.GetFileNameWithoutExtension(assetPath) + ".asset");
AddressableMetadata oldAsset = AssetDatabase.LoadAssetAtPath<AddressableMetadata>(assetMetadataPath);
if (oldAsset)
{
if (!metaDataAsset.IsDifferent(oldAsset))
{
return;
}
}
UnityEditor.AssetDatabase.CreateAsset(metaDataAsset, assetMetadataPath);
}
我们可以根据平台和语言来确定元数据素材的存放位置。
public static AddressableMetadata FindMetadataAsset(string assetName, string platformName, string languageName)
{
string MetadataAssetPath;
if (languageName !="SFX")
{
MetadataAssetPath = Path.Combine("Assets", AkAddressablesEditorSettings.Instance.MetadataPath, platformName, languageName, Path.GetFileNameWithoutExtension(assetName) + ".asset");
}
else
{
MetadataAssetPath = Path.Combine("Assets", AkAddressablesEditorSettings.Instance.MetadataPath, platformName, Path.GetFileNameWithoutExtension(assetName) + ".asset");
}
return AssetDatabase.LoadAssetAtPath<AddressableMetadata>(MetadataAssetPath);
}
//在导入 .bnk 和 .wem 文件时调用。将尝试查找并加载工程中存在的元数据对象。
public static bool GetMetadata(string assetName, string platformName, string languageName, ref AddressableMetadata metaData )
{
AddressableMetadata asset = FindMetadataAsset(assetName, platformName, languageName);
if ( asset )
{
metaData = asset;
return true;
}
return false;
}
}
}
#endif

此页面对您是否有帮助?

需要技术支持?

仍有疑问?或者问题?需要更多信息?欢迎联系我们,我们可以提供帮助!

查看我们的“技术支持”页面

介绍一下自己的项目。我们会竭力为您提供帮助。

来注册自己的项目,我们帮您快速入门,不带任何附加条件!

开始 Wwise 之旅