using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.ResourceManagement.AsyncOperations; using Object = UnityEngine.Object; namespace AibisDream.Framework { /// /// 资源加载系统静态门面。管理 Persistent / Scene 两级 Loader,提供面向业务的统一 API。 /// 调用方可通过 LoadAsync(自动路由)、LoadPersistentAsync(显式持久化)、LoadSceneAsync(显式场景级)选择目标。 /// public static class ResourceSystem { private static SceneResourceLoader _persistentLoader; private static SceneResourceLoader _sceneLoader; #region Loader Management /// /// 创建场景级 Loader。由 SceneLoader 在场景加载完成后调用。 /// public static void CreateSceneLoader() { if (_sceneLoader != null) { Debug.LogWarning("[ResourceSystem] Previous scene loader exists, releasing it."); _sceneLoader.Dispose(); } _sceneLoader = new SceneResourceLoader(isPersistent: false); Debug.Log("[ResourceSystem] Scene loader created."); } /// /// 释放场景级 Loader。由 SceneLoader 在场景卸载前调用。 /// public static void ReleaseSceneLoader() { if (_sceneLoader != null) { int releasedCount = _sceneLoader.TotalHandleCount; _sceneLoader.Dispose(); _sceneLoader = null; Debug.Log($"[ResourceSystem] Scene loader released. {releasedCount} handles released."); } } /// /// 懒加载 Persistent Loader。首次调用 LoadPersistentAsync 时自动创建。 /// private static void EnsurePersistentLoader() { if (_persistentLoader == null) { _persistentLoader = new SceneResourceLoader(isPersistent: true); Debug.Log("[ResourceSystem] Persistent loader created (lazy)."); } } #endregion #region Loader Access public static SceneResourceLoader PersistentLoader => _persistentLoader; public static SceneResourceLoader CurrentSceneLoader => _sceneLoader; private static SceneResourceLoader ActiveLoader { get { if (_sceneLoader != null) return _sceneLoader; if (_persistentLoader != null) return _persistentLoader; Debug.LogError("[ResourceSystem] No loader available. Ensure SceneLoader.CreateSceneLoader() was called."); return null; } } #endregion #region Auto-Routed API (uses ActiveLoader: scene first, falls back to persistent) public static AsyncOperationHandle LoadAsync(string key) where T : Object => ActiveLoader.LoadAsync(key); public static void LoadAsync(string key, Action onComplete, Action onError = null) where T : Object => ActiveLoader.LoadAsync(key, onComplete, onError); #endregion #region Persistent Loader API public static AsyncOperationHandle LoadPersistentAsync(string key) where T : Object { EnsurePersistentLoader(); return _persistentLoader.LoadAsync(key); } public static void LoadPersistentAsync(string key, Action onComplete, Action onError = null) where T : Object { EnsurePersistentLoader(); _persistentLoader.LoadAsync(key, onComplete, onError); } #endregion #region Scene Loader API public static AsyncOperationHandle LoadSceneAsync(string key) where T : Object { if (_sceneLoader == null) { Debug.LogError("[ResourceSystem] No scene loader. Ensure CreateSceneLoader() was called by SceneLoader."); return default; } return _sceneLoader.LoadAsync(key); } public static void LoadSceneAsync(string key, Action onComplete, Action onError = null) where T : Object { if (_sceneLoader == null) { Debug.LogError("[ResourceSystem] No scene loader. Ensure CreateSceneLoader() was called by SceneLoader."); return; } _sceneLoader.LoadAsync(key, onComplete, onError); } #endregion #region Preload & Release public static AsyncOperationHandle> PreloadByLabel(string label) where T : Object => ActiveLoader.PreloadByLabel(label); public static void EarlyRelease(string key) => ActiveLoader.EarlyRelease(key); public static void EarlyRelease(AsyncOperationHandle handle) => ActiveLoader.EarlyRelease(handle); #endregion } }