155 lines
5.3 KiB
C#
155 lines
5.3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.ResourceManagement.AsyncOperations;
|
|
using Object = UnityEngine.Object;
|
|
|
|
namespace AibisDream.Framework
|
|
{
|
|
/// <summary>
|
|
/// 资源加载系统静态门面。管理 Persistent / Scene 两级 Loader,提供面向业务的统一 API。
|
|
/// 调用方可通过 LoadAsync(自动路由)、LoadPersistentAsync(显式持久化)、LoadSceneAsync(显式场景级)选择目标。
|
|
/// </summary>
|
|
public static class ResourceSystem
|
|
{
|
|
private static SceneResourceLoader _persistentLoader;
|
|
private static SceneResourceLoader _sceneLoader;
|
|
|
|
#region Loader Management
|
|
|
|
/// <summary>
|
|
/// 创建场景级 Loader。由 SceneLoader 在场景加载完成后调用。
|
|
/// </summary>
|
|
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.");
|
|
}
|
|
|
|
/// <summary>
|
|
/// 释放场景级 Loader。由 SceneLoader 在场景卸载前调用。
|
|
/// </summary>
|
|
public static void ReleaseSceneLoader()
|
|
{
|
|
if (_sceneLoader != null)
|
|
{
|
|
int releasedCount = _sceneLoader.TotalHandleCount;
|
|
_sceneLoader.Dispose();
|
|
_sceneLoader = null;
|
|
Debug.Log($"[ResourceSystem] Scene loader released. {releasedCount} handles released.");
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 懒加载 Persistent Loader。首次调用 LoadPersistentAsync 时自动创建。
|
|
/// </summary>
|
|
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<T> LoadAsync<T>(string key) where T : Object
|
|
=> ActiveLoader.LoadAsync<T>(key);
|
|
|
|
public static void LoadAsync<T>(string key, Action<T> onComplete, Action<string> onError = null) where T : Object
|
|
=> ActiveLoader.LoadAsync(key, onComplete, onError);
|
|
|
|
#endregion
|
|
|
|
#region Persistent Loader API
|
|
|
|
public static AsyncOperationHandle<T> LoadPersistentAsync<T>(string key) where T : Object
|
|
{
|
|
EnsurePersistentLoader();
|
|
return _persistentLoader.LoadAsync<T>(key);
|
|
}
|
|
|
|
public static void LoadPersistentAsync<T>(string key, Action<T> onComplete, Action<string> onError = null)
|
|
where T : Object
|
|
{
|
|
EnsurePersistentLoader();
|
|
_persistentLoader.LoadAsync(key, onComplete, onError);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Scene Loader API
|
|
|
|
public static AsyncOperationHandle<T> LoadSceneAsync<T>(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<T>(key);
|
|
}
|
|
|
|
public static void LoadSceneAsync<T>(string key, Action<T> onComplete, Action<string> 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<IList<T>> PreloadByLabel<T>(string label) where T : Object
|
|
=> ActiveLoader.PreloadByLabel<T>(label);
|
|
|
|
public static void EarlyRelease(string key)
|
|
=> ActiveLoader.EarlyRelease(key);
|
|
|
|
public static void EarlyRelease<T>(AsyncOperationHandle<T> handle)
|
|
=> ActiveLoader.EarlyRelease(handle);
|
|
|
|
/// <summary>
|
|
/// 提前释放持久化 Loader 中指定 Key 的资源。
|
|
/// </summary>
|
|
public static void EarlyReleasePersistent(string key)
|
|
{
|
|
if (_persistentLoader != null)
|
|
_persistentLoader.EarlyRelease(key);
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|