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 static UnityEngine.AddressableAssets.Addressables; [Serializable] public class FishResourcesData { public int fishNumber; public string prefabFishResourcesPath; public string dieEffectAssets; /// /// 出场音频 /// public List showAudio; /// /// 移动音频 /// public List moveAudio; /// /// 死亡音效 1,2,3 /// public List dieAudio; /// /// 爆奖音效 /// public Dictionary dieGlodAduio; const string prefabFish_AALabel="FishPrefab"; const string dieSpine_AALabel = "DieSpine"; const string Sprite_AALabel = "TuJian"; private static Dictionary FishResourcesPrefabsDic ;//prefabpath--id private static Dictionary FishResourcesSpineDieDic ;//dieSpinepath--id private static Dictionary FishResourcesSpriteDic;//Spritepath--id static FishResourcesData() { Init(); } async static void Init() { string prefabFishPath = Resources.Load("tbfishresources").text; var v = JsonConvert.DeserializeObject>(prefabFishPath); FishResourcesPrefabsDic = new Dictionary(); fishResourcesDatasDic = new Dictionary(); FishResourcesSpineDieDic = new Dictionary(); FishResourcesSpriteDic = new Dictionary(); foreach (var item in v) { if (item.prefabFishResourcesPath != null && item.prefabFishResourcesPath != "") { Debug.Log($"添加鱼资源数据: {item.fishNumber} - {item.prefabFishResourcesPath}"); FishResourcesPrefabsDic.Add(item.prefabFishResourcesPath, item.fishNumber); FishResourcesSpriteDic.Add(item.prefabFishResourcesPath, item.fishNumber); if (item.dieEffectAssets != null && item.dieEffectAssets != "") { FishResourcesSpineDieDic.Add(item.dieEffectAssets, item.fishNumber); } fishResourcesDatasDic.Add(item.fishNumber, item); } } } private static Dictionary fishPrefabDic;//id--prefabs public static Dictionary fishResourcesDatasDic;//id--FishResourcesData public static Dictionary fishResourcesSpritesDic;//id--Sprite private static Dictionary diePrefabDic;//id--SkeletonDataAsset public static async Task LoadFishAssetsData() { // 清空对象池 Pool.Instance.Clear(); fishPrefabDic = new Dictionary(); diePrefabDic = new Dictionary(); fishResourcesSpritesDic = new Dictionary(); // ---------------- 1. 预下载所有依赖资源(关键) ---------------- var labels = new List { prefabFish_AALabel, dieSpine_AALabel, Sprite_AALabel, GameManager.Instance.gameData.currGameType.ToString() }; Debug.Log("开始预下载所有鱼资源依赖..."); var depHandle = Addressables.DownloadDependenciesAsync(labels, MergeMode.Intersection); await depHandle.Task; Addressables.Release(depHandle); Debug.Log("依赖资源预下载完成!"); // ---------------- 2. 加载 Prefab ---------------- var prefabKeys = new List { prefabFish_AALabel, GameManager.Instance.gameData.currGameType.ToString() }; var prefabHandle = Addressables.LoadAssetsAsync(prefabKeys, prefab => { if (FishResourcesPrefabsDic.TryGetValue(prefab.name, out int id)) { fishPrefabDic[id] = prefab; var mc = prefab.GetComponent(); if (mc != null) mc.fishTypeID = id; Pool.Instance.dic[id] = new PoolData(prefab, CreateFishManager.Instance.poolRoot.gameObject, id); } }, MergeMode.Intersection); await prefabHandle.Task; Addressables.Release(prefabHandle); Debug.Log($"Prefab 加载完成,共 {fishPrefabDic.Count} 个"); // ---------------- 3. 加载死亡 Spine 动效 ---------------- var dieKeys = new List { dieSpine_AALabel, GameManager.Instance.gameData.currGameType.ToString() }; var dieHandle = Addressables.LoadAssetsAsync(dieKeys, data => { if (FishResourcesSpineDieDic.TryGetValue(data.name, out int id)) { diePrefabDic[id] = data; } }, MergeMode.Intersection); await dieHandle.Task; Addressables.Release(dieHandle); Debug.Log($"死亡 Spine 加载完成,共 {diePrefabDic.Count} 个"); // ---------------- 4. 加载鱼 Sprite ---------------- var spriteKeys = new List { Sprite_AALabel, GameManager.Instance.gameData.currGameType.ToString() }; var spriteHandle = Addressables.LoadAssetsAsync(spriteKeys, data => { if (FishResourcesSpriteDic.TryGetValue(data.name, out int id)) { fishResourcesSpritesDic[id] = data; } }, MergeMode.Intersection); await spriteHandle.Task; Addressables.Release(spriteHandle); Debug.Log($"Sprite 加载完成,共 {fishResourcesSpritesDic.Count} 个"); Debug.Log("所有鱼资源加载完毕!"); } public static async Task UnLoadFishAssetsData() { Pool.Instance.Clear(); // 卸载 Prefab var keys = new List { prefabFish_AALabel, GameManager.Instance.gameData.currGameType.ToString() }; var prefabHandle = Addressables.LoadAssetsAsync(keys, null, MergeMode.Intersection); await prefabHandle.Task; if (prefabHandle.Result != null) { foreach (var prefab in prefabHandle.Result) { if (FishResourcesPrefabsDic.TryGetValue(prefab.name, out int id)) { if (fishPrefabDic.Remove(id)) { Debug.Log($"卸载鱼Prefab: {prefab.name} (ID={id})"); } } } } Addressables.Release(prefabHandle); // 卸载死亡 Spine 动效 keys = new List { dieSpine_AALabel, GameManager.Instance.gameData.currGameType.ToString() }; var dieHandle = Addressables.LoadAssetsAsync(keys, null, MergeMode.Intersection); await dieHandle.Task; if (dieHandle.Result != null) { foreach (var data in dieHandle.Result) { if (FishResourcesSpineDieDic.TryGetValue(data.name, out int id)) { if (diePrefabDic.Remove(id)) { Debug.Log($"卸载鱼死亡动效: {data.name} (ID={id})"); } } } } Addressables.Release(dieHandle); // 卸载鱼 Sprite keys = new List { Sprite_AALabel, GameManager.Instance.gameData.currGameType.ToString() }; var spriteHandle = Addressables.LoadAssetsAsync(keys, null, MergeMode.Intersection); await spriteHandle.Task; if (spriteHandle.Result != null) { foreach (var sprite in spriteHandle.Result) { if (FishResourcesSpriteDic.TryGetValue(sprite.name, out int id)) { if (fishResourcesSpritesDic.Remove(id)) { Debug.Log($"卸载鱼Sprite: {sprite.name} (ID={id})"); } } } } Addressables.Release(spriteHandle); Debug.Log($"卸载完成,剩余Prefab数量: {fishPrefabDic.Count}, 死亡动效数量: {diePrefabDic.Count}, Sprite数量: {fishResourcesSpritesDic.Count}"); } public static GameObject GetFishPrefab(int fishNumber) { if (fishPrefabDic != null && fishPrefabDic.ContainsKey(fishNumber)) { return fishPrefabDic[fishNumber]; } else { Debug.LogError($"鱼Prefab未找到: {fishNumber}"); return null; } } public static SkeletonDataAsset GetFishDieSpine(int fishNumber) { if (diePrefabDic != null && diePrefabDic.ContainsKey(fishNumber)) { return diePrefabDic[fishNumber]; } else { Debug.LogError($"鱼死亡动效未找到: {fishNumber}"); return null; } } }