using Newtonsoft.Json; using Spine.Unity; using System; using System.Collections; using System.Collections.Generic; using System.Threading.Tasks; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.InputSystem; using UnityEngine.ResourceManagement.AsyncOperations; using static UnityEngine.AddressableAssets.Addressables; [Serializable] public class AudioResourcesData { public int audioID; public string audioResourcesPath; public static Dictionary name_IDDic=new Dictionary(); public static Dictionary audioClipDic=new Dictionary(); static Dictionary audioClipDefaultDic=new Dictionary(); static Dictionary audioClipGameDic=new Dictionary(); const string Audio_AALabel="Audio"; static AudioResourcesData() { //这里要添加默认的音效 背景 按钮点击 LoadDefaultAudioGame(); } static async void LoadDefaultAudioGame() { string prefabFishPath = Resources.Load("tbaudio").text; var v = JsonConvert.DeserializeObject>(prefabFishPath); foreach (var item in v) { Debug.Log("加载文件音频ID: " + item.audioID); Debug.Log(item.audioID + "加载文件音频路径: " + item.audioResourcesPath); name_IDDic[item.audioResourcesPath]=item.audioID; } var keys = new List { Audio_AALabel, "Default" }; await Addressables.LoadAssetsAsync(keys, audio => { Debug.Log("加载音频: " + audio.name); if (name_IDDic.ContainsKey(audio.name)) { Debug.Log("加载音频ID: " + name_IDDic[audio.name]); audioClipDefaultDic.Add(name_IDDic[audio.name],audio); } }, MergeMode.Intersection).Task; foreach (var item in audioClipDefaultDic) { audioClipDic.Add(item.Key, item.Value); } Debug.Log("加载了:"+ audioClipDic.Count); } //public static async Task LoadAudioGame() //{ // GameType gameType=GameManager.Instance.gameData.currGameType; // var keys = new List { Audio_AALabel, gameType.ToString() }; // await Addressables.LoadAssetsAsync(keys, audio => // { // //Debug.Log("加载音频: " + audio.name); // //Debug.Log("加载音频ID: " + name_IDDic[audio.name]); // if (name_IDDic.ContainsKey(audio.name)) // { // audioClipGameDic[name_IDDic[audio.name]]= audio; // } // }, MergeMode.Intersection).Task; // audioClipDic=new Dictionary(audioClipDefaultDic); // foreach (var item in audioClipGameDic) // { // audioClipDic[item.Key]=item.Value; // } // Debug.Log("加载了:"+ audioClipDic.Count); //} public static async Task LoadAudioGame() { GameType gameType = GameManager.Instance.gameData.currGameType; var keys = new List { Audio_AALabel, gameType.ToString() }; try { await Addressables.LoadAssetsAsync(keys, audio => { if (name_IDDic != null && name_IDDic.ContainsKey(audio.name)) { audioClipGameDic[name_IDDic[audio.name]] = audio; } }, MergeMode.Union).Task; audioClipDic = new Dictionary(); if (audioClipDefaultDic != null) { foreach (var item in audioClipDefaultDic) audioClipDic[item.Key] = item.Value; } foreach (var item in audioClipGameDic) { audioClipDic[item.Key] = item.Value; } Debug.Log("加载音频数量: " + audioClipDic.Count); } catch (Exception e) { Debug.LogError($"加载游戏音频失败: {e.Message}"); } } public static async Task UnLoadAudioGame() { GameType gameType = GameManager.Instance.gameData.currGameType; var keys = new List { Audio_AALabel, gameType.ToString() }; // 加载对应的句柄(只是为了拿到引用,之后释放) AsyncOperationHandle> handle = Addressables.LoadAssetsAsync(keys, null, MergeMode.Intersection); await handle.Task; // 遍历卸载对应的音频 foreach (var audio in handle.Result) { if (name_IDDic.ContainsKey(audio.name)) { int id = name_IDDic[audio.name]; if (audioClipGameDic.ContainsKey(id)) { audioClipGameDic.Remove(id); Debug.Log($"卸载音频: {audio.name} (ID={id})"); } } } // 释放 Addressables 资源句柄 Addressables.Release(handle); // 重建总字典:保留默认音频 + 剩余游戏音频 audioClipDic = new Dictionary(audioClipDefaultDic); foreach (var item in audioClipGameDic) { audioClipDic[item.Key] = item.Value; } Debug.Log("卸载完成,当前音频数量:" + audioClipDic.Count); } }