バージョン

menu_open
Wwise Unity Integration Documentation
Wwise Addressablesサンプル

Wwise Addressablesアセットのメタデータの維持

Addressablesとして扱えるWwiseアセットで作業する時にWwiseAddressableBankアセットを最新状態にするには、生成されたサウンドバンクフォルダを削除してサウンドバンクを再生成するのが最も簡単な方法です。Addressablesアセットを削除するとアセットが削除されてAddressablesグループの中身が消えるので、再度インポートすると親グループやラベルが失われます。このサンプルスクリプトはWwise Unity Addressablesパッケージに含まれ、Addressableアセットのメタデータ、つまり親グループやラベルなどを維持(preserve)できる機能を提供します。

仕組み

失われたグループやラベルが復元しやすくなるオプション設定を追加しました。Unityプロジェクト設定の Wwise Addressables で設定できます。これを有効にするとメタデータのターゲットディレクトリを指定できます。ディレクトリは、Unityプロジェクトのアセットフォルダ内のものとします。

WwiseAssetMetadataPreserverスクリプトが、プロジェクトのすべてのWwise Addressablesアセットのメタデータを保存するメニュートリガーを Assets/Wwise/Addressables の下に追加します。これがトリガーされると、Addressable Wwiseアセットごとに AddressableMetadata アセットが作成され、親グループの名前やラベルがシリアライズされます。また、スクリプト自体が WwiseBankPostProcess.GetAssetMetadataDelegate 関数で登録されます。このデリゲートによって、アセットがWwiseBankPostProcessカスタムインポーター(Unityプロジェクトに追加された時に、.bnkファイルや.wemファイルをインポートするもの)によってインポートされた時に、アセットのフィールドを設定するために使うmetadata structを外部コードから入力することが可能になります。

この2つのメカニズムでクリーンアップ前にアセットメタデータをシリアライズすることができ、サウンドバンクを生成してからアセットを再度インポートする時にアセットに再び適用できます。

注記: このスクリプトは、手順を示した一例です。制作条件に合わせて独自のメタデータフィラーを作成して実装させた方が適切なこともあります。

サンプルコード

#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アセットグループやラベルのメタデータを維持してリストアする機能を提供します。
アセットを削除するとこの情報が失われ、Wwise Addressablesアセットフォルダをクリアするのが、壊れたWwiseAddressableSounbankを修復するには最も簡単な方法です。
このクラスは、この機能の実装方法を示す一例であり、完全なソリューションではありません。
*/
[InitializeOnLoad]
class WwiseAddressableAssetMetadataPreserver
{
static WwiseAddressableAssetMetadataPreserver()
{
if (AkAddressablesEditorSettings.Instance.UseSampleMetadataPreserver)
{
BindMetadataDelegate();
}
}
//WwiseBankPostProcess AssetPostProcessor(.bnkファイルや.wemファイルのインポートを担当)にGetAssetMetadataDelegateを設定。
public static void BindMetadataDelegate()
{
WwiseBankPostProcess.GetAssetMetadataDelegate += GetMetadata;
}
//デリゲートの設定解除(この機能を無効にした時)
public static void UnbindMetaDataDelegate()
{
WwiseBankPostProcess.GetAssetMetadataDelegate -= GetMetadata;
}
//WwiseのAddressablesアセットごとにAddressableMetadataアセットを作成し、グループやラベルを記録。
//Metadataアセットをwwise assetに合った階層内で専用フォルダ内に作成
//フォルダ階層とアセット名を使いインポート時にアセットをマッチさせます
[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からはじめよう