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
}
}