using System; using System.Collections.Generic; using System.Threading.Tasks; using UnityEngine.AddressableAssets; using static UnityEngine.AddressableAssets.Addressables; /// /// AAResourceManager /// 通用的 Addressables (aa包) 资源管理器,用于统一管理游戏资源的加载和卸载。 /// 通过标签 (Label) + 当前游戏类型 (GameType) 来筛选资源, /// 并使用映射字典 (name → id) 将资源绑定到对应的 ID,方便后续查找和使用。 /// public static class AAResourceManager { /// /// 加载资源并存入目标字典 /// /// 资源类型 (例如 GameObject, AudioClip, Sprite, SkeletonDataAsset) /// Addressables 标签,用于筛选资源 /// 玩法标签(由调用方/游戏侧传入,框架层不反向依赖游戏层) /// 映射字典 (资源名 → ID),用于将资源绑定到唯一 ID /// 目标字典 (ID → 资源),存放加载后的资源 /// 可选回调,在资源加载完成时执行 (例如绑定对象池) /// /// - 使用 Addressables.LoadAssetsAsync 按标签和玩法标签加载资源 /// - 将资源存入 targetDic,键为映射字典中的 ID /// - 可选执行 onLoaded 回调,例如 Prefab 加入对象池 /// - 最后释放 handle,避免内存泄漏 /// public static async Task LoadAssets( string label, string gameTypeLabel, Dictionary mappingDic, Dictionary targetDic, Action onLoaded = null) where T : UnityEngine.Object { // 构建 keys:标签 + 玩法标签 var keys = new List { label, gameTypeLabel }; // 异步加载资源 var handle = Addressables.LoadAssetsAsync(keys, asset => { // 根据资源名查找对应 ID if (mappingDic.TryGetValue(asset.name, out int id)) { targetDic[id] = asset; // 存入目标字典 onLoaded?.Invoke(asset, id); // 执行回调 } }, MergeMode.Intersection); await handle.Task; // 释放句柄,避免内存泄漏 Addressables.Release(handle); } /// /// 卸载资源并从目标字典移除 /// /// 资源类型 (例如 GameObject, AudioClip, Sprite, SkeletonDataAsset) /// Addressables 标签,用于筛选资源 /// 玩法标签(由调用方/游戏侧传入,框架层不反向依赖游戏层) /// 映射字典 (资源名 → ID),用于查找对应 ID /// 目标字典 (ID → 资源),存放已加载的资源 /// /// - 使用 Addressables.LoadAssetsAsync 获取当前标签下的资源列表 /// - 遍历资源,查找对应 ID 并从 targetDic 移除 /// - 最后释放 handle,避免内存泄漏 /// public static async Task UnloadAssets( string label, string gameTypeLabel, Dictionary mappingDic, Dictionary targetDic) where T : UnityEngine.Object { // 构建 keys:标签 + 玩法标签 var keys = new List { label, gameTypeLabel }; // 异步加载资源列表(仅用于获取引用) var handle = Addressables.LoadAssetsAsync(keys, null, MergeMode.Intersection); await handle.Task; // 遍历资源并移除对应条目 foreach (var asset in handle.Result) { if (mappingDic.TryGetValue(asset.name, out int id)) { targetDic.Remove(id); } } // 释放句柄,避免内存泄漏 Addressables.Release(handle); } }