internal static void RemoveBanksFromAddressableSoundbanks(HashSet <string> bankAssetsToRemove) { try { var foundBanks = AssetDatabase.FindAssets($"t:{typeof(WwiseAddressableSoundBank).Name}"); var updatedBanks = new List <string>(); foreach (var assetPath in bankAssetsToRemove) { string platform; string language; AkAddressablesEditorUtilities.ParseAssetPath(assetPath, out platform, out language); var assetGuid = AssetDatabase.AssetPathToGUID(assetPath); foreach (var bankGuid in foundBanks) { var bankPath = AssetDatabase.GUIDToAssetPath(bankGuid); var bank = AssetDatabase.LoadAssetAtPath <WwiseAddressableSoundBank>(bankPath); if (bank.TryRemoveBank(platform, language, assetGuid)) { EditorUtility.SetDirty(bank); break; } } } } finally { AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } }
internal static void AddStreamedAssetsToBanks(HashSet <string> streamingAssetsAdded) { try { var updatedBanks = new List <string>(); foreach (var assetPath in streamingAssetsAdded) { string name = Path.GetFileNameWithoutExtension(assetPath); string platform; string language; AkAddressablesEditorUtilities.ParseAssetPath(assetPath, out platform, out language); var soundbankInfos = AkAddressablesEditorUtilities.ParsePlatformSoundbanksXML(platform, name); var bankNames = soundbankInfos.eventToSoundBankMap[name]; foreach (var bankName in bankNames) { string bankAssetDir = Path.GetDirectoryName(assetPath); string addressableBankAssetDir = AkAssetUtilities.GetSoundbanksPath(); string addressableBankAssetPath = System.IO.Path.Combine(addressableBankAssetDir, bankName + ".asset"); var bankAsset = AssetDatabase.LoadAssetAtPath <WwiseAddressableSoundBank>(addressableBankAssetPath); if (bankAsset == null) { continue; } if (!string.IsNullOrEmpty(platform)) { List <string> MediaIds = soundbankInfos[bankName][language].streamedFiles.Select(streamedFile => streamedFile.id).ToList(); bankAsset.UpdateLocalizationLanguages(platform, soundbankInfos[bankName].Keys.ToList()); bankAsset.SetStreamingMedia(platform, language, bankAssetDir, MediaIds); EditorUtility.SetDirty(bankAsset); } } } } finally { AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } }
public override void OnImportAsset(AssetImportContext ctx) { string assetName = Path.GetFileNameWithoutExtension(ctx.assetPath); string platform; string language; AkAddressablesEditorUtilities.ParseAssetPath(ctx.assetPath, out platform, out language); if (platform == null) { return; } WwiseStreamingMediaAsset dataAsset = ScriptableObject.CreateInstance <WwiseStreamingMediaAsset>(); dataAsset.RawData = File.ReadAllBytes(Path.GetFullPath(ctx.assetPath)); byte[] hash = MD5.Create().ComputeHash(dataAsset.RawData); dataAsset.hash = hash; ctx.AddObjectToAsset(string.Format("WwiseSteamingMedia_{0}{1}_{2}", platform, language, assetName), dataAsset); ctx.SetMainObject(dataAsset); }
public override void OnImportAsset(AssetImportContext ctx) { string assetName = Path.GetFileNameWithoutExtension(ctx.assetPath); string platform; string language; AkAddressablesEditorUtilities.ParseAssetPath(ctx.assetPath, out platform, out language); if (platform == null) { return; } var soundbankInfos = AkAddressablesEditorUtilities.ParsePlatformSoundbanksXML(platform, assetName); if (!soundbankInfos.ContainsKey(assetName)) { Debug.LogWarning($"Skipping {ctx.assetPath} as it was not parsed in SoundbanksInfo.xml. Perhaps this bank no longer exists in the wwise project?"); return; } WwiseSoundBankAsset dataAsset = ScriptableObject.CreateInstance <WwiseSoundBankAsset>(); dataAsset.RawData = File.ReadAllBytes(Path.GetFullPath(ctx.assetPath)); var eventNames = soundbankInfos[assetName][language].events; if (language != "SFX" && soundbankInfos[assetName].ContainsKey("SFX")) { eventNames.AddRange(soundbankInfos[assetName]["SFX"].events); } dataAsset.eventNames = eventNames; byte[] hash = MD5.Create().ComputeHash(dataAsset.RawData); dataAsset.hash = hash; ctx.AddObjectToAsset(string.Format("WwiseBank_{0}{1}_{2}", platform, language, assetName), dataAsset); ctx.SetMainObject(dataAsset); }
internal static void AddAssetsToAddressablesGroup(HashSet <string> assetsAdded, string groupName = "") { if (AddressableAssetSettingsDefaultObject.Settings == null) { AddressableAssetSettingsDefaultObject.Settings = AddressableAssetSettings.Create(AddressableAssetSettingsDefaultObject.kDefaultConfigFolder, AddressableAssetSettingsDefaultObject.kDefaultConfigAssetName, true, true); } var settings = AddressableAssetSettingsDefaultObject.Settings; if (settings == null) { Debug.LogWarningFormat("[Addressables] settings file not found.\nPlease go to Menu/Window/Asset Management/Addressables/Groups, then click 'Create Addressables Settings' button."); return; } List <AddressableAssetEntry> groupEntriesModified = new List <AddressableAssetEntry>(); var parseGroupNames = string.IsNullOrEmpty(groupName); foreach (var assetPath in assetsAdded) { string guid = AssetDatabase.AssetPathToGUID(assetPath); string platform; string language; AkAddressablesEditorUtilities.ParseAssetPath(assetPath, out platform, out language); AddressableMetadata assetMetadata = ScriptableObject.CreateInstance <AddressableMetadata>(); if (parseGroupNames) { if (string.IsNullOrEmpty(platform)) { Debug.LogError($"Wwise Addressables import : could not parse platform for {assetPath}. It will not be made addressable."); continue; } if (GetAssetMetadataDelegate != null) { if (!GetAssetMetadataDelegate.Invoke(Path.GetFileName(assetPath), platform, language, ref assetMetadata)) { // If we can't find a metadata asset use the default group name assetMetadata.groupName = GetDefaultAddressableGroup(Path.GetFileName(assetPath), platform); } } else { assetMetadata.groupName = GetDefaultAddressableGroup(Path.GetFileName(assetPath), platform); } } else { assetMetadata.groupName = groupName; } AddressableAssetGroup group = GetOrAddGroup(settings, assetMetadata.groupName); var groupEntry = settings.CreateOrMoveEntry(guid, group); if (groupEntry != null) { if (assetMetadata.labels.Count > 0) { foreach (string label in assetMetadata.labels) { groupEntry.labels.Add(label); } } groupEntriesModified.Add(groupEntry); } } if (groupEntriesModified.Count > 0) { settings.SetDirty(AddressableAssetSettings.ModificationEvent.EntryMoved, groupEntriesModified, true); AssetDatabase.SaveAssets(); } }
internal static void AddBankReferenceToAddressableBankAsset(ConcurrentDictionary <string, WwiseAddressableSoundBank> addressableAssetCache, HashSet <string> bankAssetsAdded) { List <CreateAssetEntry> itemsToCreate = new List <CreateAssetEntry>(); try { foreach (var bankPath in bankAssetsAdded) { string name = Path.GetFileNameWithoutExtension(bankPath); string platform; string language; AkAddressablesEditorUtilities.ParseAssetPath(bankPath, out platform, out language); // First find or create AddressableBank asset WwiseAddressableSoundBank addressableBankAsset = null; if (!addressableAssetCache.TryGetValue(name, out addressableBankAsset)) { var results = AssetDatabase.FindAssets(string.Format("{0} t:{1}", name, nameof(WwiseAddressableSoundBank))); if (results.Length > 0) { string addressableBankGuid = results.First(); string addressableBankPath = AssetDatabase.GUIDToAssetPath(addressableBankGuid); addressableBankAsset = AssetDatabase.LoadAssetAtPath <WwiseAddressableSoundBank>(addressableBankPath); } string addressableBankAssetDirectory = AkAssetUtilities.GetSoundbanksPath(); string addressableBankAssetPath = string.Format("{0}/{1}", addressableBankAssetDirectory, Path.ChangeExtension(name, ".asset")); if (addressableBankAsset == null) { if (!AssetDatabase.IsValidFolder(addressableBankAssetDirectory)) { StringBuilder currentPathBuilder = new StringBuilder(); var addressableBankAssetParts = addressableBankAssetDirectory.Split('/'); currentPathBuilder.Append(addressableBankAssetParts[0]); for (int i = 1; i < addressableBankAssetParts.Length; ++i) { string previousPath = currentPathBuilder.ToString(); currentPathBuilder.AppendFormat("/{0}", addressableBankAssetParts[i]); string currentPath = currentPathBuilder.ToString(); if (!AssetDatabase.IsValidFolder(currentPath)) { AssetDatabase.CreateFolder(previousPath, addressableBankAssetParts[i]); } } } addressableBankAsset = ScriptableObject.CreateInstance <WwiseAddressableSoundBank>(); itemsToCreate.Add(new CreateAssetEntry { Asset = addressableBankAsset, Path = addressableBankAssetPath, Name = name }); } else { UpdateAddressableBankReference(addressableBankAsset, name); } addressableAssetCache.AddOrUpdate(name, addressableBankAsset, (key, oldValue) => addressableBankAsset); if (name == "Init") { var wwiseGlobablGameObject = GameObject.Find("WwiseGlobal"); InitBankHolder bankHolder; if (wwiseGlobablGameObject != null) { bankHolder = wwiseGlobablGameObject.GetComponent <InitBankHolder>(); if (bankHolder == null) { wwiseGlobablGameObject.AddComponent <InitBankHolder>(); bankHolder = wwiseGlobablGameObject.GetComponent <InitBankHolder>(); } bankHolder.InitBank = addressableBankAsset; } else { bankHolder = UnityEngine.Object.FindObjectOfType <InitBankHolder>(); if (bankHolder != null) { bankHolder.InitBank = addressableBankAsset; } else { Debug.Log("Could not find or create the InitBankHolder, you will have to add one to the WwiseGlobal object in your scene and ensure it references the Init bank."); } } } } if (!string.IsNullOrEmpty(platform)) { var soundbankInfos = AkAddressablesEditorUtilities.ParsePlatformSoundbanksXML(platform, name); if (soundbankInfos.ContainsKey(name)) { addressableBankAsset.UpdateLocalizationLanguages(platform, soundbankInfos[name].Keys.ToList()); addressableBankAsset.AddOrUpdate(platform, language, new AssetReferenceWwiseBankData(AssetDatabase.AssetPathToGUID(bankPath))); EditorUtility.SetDirty(addressableBankAsset); } else { Debug.LogWarning($"Could not update {addressableBankAsset.name} with bank located at {bankPath}"); } } } } finally { if (itemsToCreate.Count > 0) { AssetDatabase.StartAssetEditing(); foreach (var entry in itemsToCreate) { AssetDatabase.CreateAsset(entry.Asset, entry.Path); UpdateAddressableBankReference(entry.Asset, entry.Name); } AssetDatabase.StopAssetEditing(); } AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } }