Files
aibis-dream/Assets/Scripts/Framework/ResourceKit/ResourceSystem.cs
T

146 lines
5.0 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);
#endregion
}
}