menu
 
버전
2024.1.2.8726

2024.1.2.8726

2023.1.10.8659

2022.1.18.8567

2021.1.14.8108

2019.2.15.7667

2019.1.11.7296

2018.1.11.6987

2017.2.10.6745

2017.1.9.6501

2016.2.6.6153

2015.1.9.5624


menu_open
알림: 고객님의 주요 출시 버전( 2024.1.2.8726 )에 해당하는 최신 설명서로 이동했습니다. 특정 버전의 설명서를 보시려면 Audiokinetic 런처에서 오프라인 설명서를 다운로드하고 Wwise Authoring의 Offline Documentation을 확인하세요.
Wwise Unity Integration Documentation
Wwise Addressable Samples

The Wwise 어드레서블 에셋 메타데이터 Preserver

어드레서블 Wwise 에셋으로 작업할 때 WwiseAddressableBank 에셋을 최신 상태로 유지하는 가장 쉬운 방법은 생성된 Soundbank 폴더를 삭제하고 Soundbank를 재생성하는 것입니다. 어드레서블 에셋을 삭제하면 에셋이 삭제될 때 어드레서블 그룹의 내용이 지워지므로 에셋을 다시 가져올 때 상위 그룹과 레이블이 손실됩니다. Wwise Unity Addressables 패키지에 포함된 이 샘플 스크립트는 상위 그룹 및 레이블과 같은 어드레서블 에셋 메타데이터를 보존하는 기능을 제공합니다.

작동 원리

손실된 그룹 및 레이블을 복원하는 데 도움이 되도록 활성화할 수 있는 설정을 추가했습니다. Unity Project Setting-Wwise Addressables에서 찾을 수 있습니다.. 활성화되면 메타데이터의 대상 폴더를 지정할 수 있습니다. 이 폴더는 Unity 프로젝트의 에셋 폴더 내에 있어야 합니다.

WwiseAssetMetadataPreserver 스크립트는 Assets/Wwise/Addressables 아래에 메뉴 트리거를 추가하여 프로젝트에 있는 모든 Wwise 어드레서블 에셋의 메타데이터를 저장합니다. 트리거되면 어드레서블 각 Wwise 에셋에 대해 AddressableMetadata 자산이 생성되어 상위 그룹 및 레이블의 이름을 직렬화(serializing)합니다. 스크립트는 또한 WwiseBankPostProcess.GetAssetMetadataDelegate 함수에 자체 등록합니다. 이 델리게이트는 WwiseBankPostProcess 커스텀 임포터(Unity 프로젝트에 추가될 때 .bnk 및 .wem 파일 임포트)로 임포트할 때 애셋의 필드를 설정하는 데 사용한 메타데이터 구조를 외부 코드에서 채울 수 있도록 합니다.

이 두 가지 메커니즘을 통해 에셋 메타데이터는 정리를 수행하기 전에 직렬화(serialized)할 수 있으며 사운드뱅크를 생성한 후 에셋을 다시 가져올 때 에셋에 다시 적용됩니다.

info참고:

이 스크립트는 이 작업을 수행할 수 있는 방법의 예시입니다. 프로덕션 요구 사항에 더 잘 맞는 고유한 메타데이터 필러(metadata filler)를 구현하는 것이 더 관련성이 있음을 알 수 있습니다.

예제 코드

#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 어드레서블 에셋 그룹과 레이블 메타데이터를 보존하고 복원하는 기능을 제공합니다.
이 정보는 에셋이 삭제되면 손실되며 Wwise 어드레서블 에셋 폴더를 지우는 것은 문제가 발생한 WwiseAddressableSounbanks를 복구하는 가장 간단한 방법입니다.
이 클래스는 완전한 솔루션이 아니라 이 기능을 구현하는 방법에 대한 예시입니다.
*/
[InitializeOnLoad]
class WwiseAddressableAssetMetadataPreserver
{
static WwiseAddressableAssetMetadataPreserver()
{
if (AkAddressablesEditorSettings.Instance.UseSampleMetadataPreserver)
{
BindMetadataDelegate();
}
}
//Sets the GetAssetMetadataDelegate on the WwiseBankPostProcess AssetPostProcessor (.bnk 및 .wem 파일 가져오기를 처리합니다.)
public static void BindMetadataDelegate()
{
WwiseBankPostProcess.GetAssetMetadataDelegate += GetMetadata;
}
//Unset the delegate (기능이 비활성화된 경우)
public static void UnbindMetaDataDelegate()
{
WwiseBankPostProcess.GetAssetMetadataDelegate -= GetMetadata;
}
//그룹과 레이블을 추적하는 각 어드레서블 wwise 에셋에 대해 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를 시작해 보세요