fix(resource-kit): 修复场景资源加载器生命周期与初始化时序

Made-with: Cursor
This commit is contained in:
2026-03-26 16:08:41 +08:00
parent 7291dfb031
commit 0ebbc9c341
6 changed files with 70 additions and 79 deletions
@@ -15,37 +15,46 @@ namespace AibisDream.Framework
private static SceneResourceLoader _persistentLoader;
private static SceneResourceLoader _sceneLoader;
#region Loader Registration
#region Loader Management
public static void RegisterPersistentLoader(SceneResourceLoader loader)
/// <summary>
/// 创建场景级 Loader。由 SceneLoader 在场景加载完成后调用。
/// </summary>
public static void CreateSceneLoader()
{
if (_persistentLoader != null && _persistentLoader != loader)
Debug.LogWarning("[ResourceSystem] Replacing existing persistent loader.");
_persistentLoader = loader;
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.");
}
public static void UnregisterPersistentLoader(SceneResourceLoader loader)
/// <summary>
/// 释放场景级 Loader。由 SceneLoader 在场景卸载前调用。
/// </summary>
public static void ReleaseSceneLoader()
{
if (_persistentLoader == loader)
_persistentLoader = null;
}
public static void RegisterSceneLoader(SceneResourceLoader loader)
{
if (_sceneLoader != null && _sceneLoader != loader)
Debug.LogWarning("[ResourceSystem] Replacing existing scene loader. Was the previous scene properly unloaded?");
_sceneLoader = loader;
}
public static void UnregisterSceneLoader(SceneResourceLoader loader)
{
if (_sceneLoader == loader)
if (_sceneLoader != null)
{
int releasedCount = _sceneLoader.TotalHandleCount;
_sceneLoader.Dispose();
_sceneLoader = null;
Debug.Log($"[ResourceSystem] Scene loader released. {releasedCount} handles released.");
}
}
public static void UnregisterSceneLoader()
/// <summary>
/// 懒加载 Persistent Loader。首次调用 LoadPersistentAsync 时自动创建。
/// </summary>
private static void EnsurePersistentLoader()
{
_sceneLoader = null;
if (_persistentLoader == null)
{
_persistentLoader = new SceneResourceLoader(isPersistent: true);
Debug.Log("[ResourceSystem] Persistent loader created (lazy).");
}
}
#endregion
@@ -61,7 +70,7 @@ namespace AibisDream.Framework
{
if (_sceneLoader != null) return _sceneLoader;
if (_persistentLoader != null) return _persistentLoader;
Debug.LogError("[ResourceSystem] No loader registered. Ensure a SceneResourceLoader exists in the scene.");
Debug.LogError("[ResourceSystem] No loader available. Ensure SceneLoader.CreateSceneLoader() was called.");
return null;
}
}
@@ -82,14 +91,14 @@ namespace AibisDream.Framework
public static AsyncOperationHandle<T> LoadPersistentAsync<T>(string key) where T : Object
{
EnsureLoader(_persistentLoader, "persistent");
EnsurePersistentLoader();
return _persistentLoader.LoadAsync<T>(key);
}
public static void LoadPersistentAsync<T>(string key, Action<T> onComplete, Action<string> onError = null)
where T : Object
{
EnsureLoader(_persistentLoader, "persistent");
EnsurePersistentLoader();
_persistentLoader.LoadAsync(key, onComplete, onError);
}
@@ -99,14 +108,22 @@ namespace AibisDream.Framework
public static AsyncOperationHandle<T> LoadSceneAsync<T>(string key) where T : Object
{
EnsureLoader(_sceneLoader, "scene");
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
{
EnsureLoader(_sceneLoader, "scene");
if (_sceneLoader == null)
{
Debug.LogError("[ResourceSystem] No scene loader. Ensure CreateSceneLoader() was called by SceneLoader.");
return;
}
_sceneLoader.LoadAsync(key, onComplete, onError);
}
@@ -124,11 +141,5 @@ namespace AibisDream.Framework
=> ActiveLoader.EarlyRelease(handle);
#endregion
private static void EnsureLoader(SceneResourceLoader loader, string loaderName)
{
if (loader == null)
Debug.LogError($"[ResourceSystem] No {loaderName} loader registered.");
}
}
}