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();
            }
        }
Exemple #2
0
        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 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();
            }
        }