fix(resource-kit): 修复场景资源加载器生命周期与初始化时序
Made-with: Cursor
This commit is contained in:
@@ -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.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user