using Cysharp.Threading.Tasks; using UnityEngine; using UnityEngine.U2D; using ProjSG.Resource; /// /// 注册 SpriteAtlasManager.atlasRequested 回调, /// 当 Unity 运行时需要 SpriteAtlas (V2) 时通过 YooAsset 异步加载图集。 /// /// 根本原因:项目使用 63+ 个 SpriteAtlas V2 (.spriteatlasv2) 文件, /// Prefab 中静态引用的 Sprite 在 AssetBundle 运行时需要通过此回调 /// 加载对应的 SpriteAtlas 才能正确显示。 /// 编辑器下 Unity 自动处理,但构建后(尤其 WebGL)必须手动处理。 /// public static class SpriteAtlasHandler { private static bool _registered; /// /// 注册 atlasRequested 回调。应在 YooAsset 初始化完成后、UI 加载前调用。 /// public static void Register() { if (_registered) return; _registered = true; SpriteAtlasManager.atlasRequested += OnAtlasRequested; Debug.Log("[SpriteAtlasHandler] atlasRequested callback registered."); } private static void OnAtlasRequested(string tag, System.Action callback) { Debug.Log($"[SpriteAtlasHandler] Atlas requested: tag='{tag}'"); LoadAtlasAsync(tag, callback).Forget(); } private static async UniTaskVoid LoadAtlasAsync(string tag, System.Action callback) { // 主目录: Assets/ResourcesOut/Sprite/{tag}.spriteatlasv2 (UI 包) string location = $"Assets/ResourcesOut/Sprite/{tag}.spriteatlasv2"; try { var atlas = await YooAssetService.Instance.LoadAssetAsync(location); if (atlas != null) { Debug.Log($"[SpriteAtlasHandler] Loaded atlas '{tag}' from '{location}'"); callback(atlas); return; } } catch (System.Exception ex) { Debug.LogWarning($"[SpriteAtlasHandler] Failed to load atlas from '{location}': {ex.Message}"); } // 回退: Assets/ResourcesOut/BuiltIn/Sprites/{tag}.spriteatlasv2 (Builtin 包) string builtinLocation = $"Assets/ResourcesOut/BuiltIn/Sprites/{tag}.spriteatlasv2"; try { var atlas = await YooAssetService.Instance.LoadAssetAsync(builtinLocation); if (atlas != null) { Debug.Log($"[SpriteAtlasHandler] Loaded atlas '{tag}' from '{builtinLocation}'"); callback(atlas); return; } } catch (System.Exception ex) { Debug.LogWarning($"[SpriteAtlasHandler] Failed to load atlas from '{builtinLocation}': {ex.Message}"); } Debug.LogError($"[SpriteAtlasHandler] Could not load SpriteAtlas for tag '{tag}'. " + $"Searched: '{location}', '{builtinLocation}'"); } }