多轮审查和修复

This commit is contained in:
2026-05-12 15:34:08 +08:00
parent f55d2a57c3
commit ebbbb7332e
805 changed files with 838724 additions and 1905 deletions

View File

@@ -9,9 +9,9 @@ using BaseGames.Core.Events;
namespace BaseGames.Core
{
/// <summary>
/// Addressables 场景加载器Phase 0 骨架)
/// Addressables 场景加载器。
/// 监听 EVT_SceneLoadRequestAdditive 加载指定场景,完成后发布 EVT_SceneLoaded。
/// Phase 1 完整实现由 SceneService 包装调用。
/// 完整实现由 SceneService 包装调用。
/// </summary>
[DefaultExecutionOrder(-950)]
public class SceneLoader : MonoBehaviour
@@ -24,17 +24,16 @@ namespace BaseGames.Core
private string _currentRoomScene;
private AsyncOperationHandle<SceneInstance> _currentHandle;
private readonly CompositeDisposable _subs = new();
private void OnEnable()
{
if (_onSceneLoadRequest != null)
_onSceneLoadRequest.OnEventRaised += HandleRequest;
_onSceneLoadRequest?.Subscribe(HandleRequest).AddTo(_subs);
}
private void OnDisable()
{
if (_onSceneLoadRequest != null)
_onSceneLoadRequest.OnEventRaised -= HandleRequest;
_subs.Clear();
}
private void HandleRequest(SceneLoadRequest request)
@@ -42,27 +41,27 @@ namespace BaseGames.Core
private IEnumerator LoadSceneCoroutine(SceneLoadRequest request)
{
// 卸载旧场景
// 先加载新场景Additive成功后再卸载旧场景
// 顺序保证:若加载失败,旧场景仍保持可用,不会出现无场景的空状态
var loadOp = Addressables.LoadSceneAsync(request.SceneName, LoadSceneMode.Additive);
yield return loadOp;
if (loadOp.Status != AsyncOperationStatus.Succeeded)
{
Debug.LogError($"[SceneLoader] 加载场景失败:{request.SceneName}(旧场景保持不变)");
yield break;
}
// 新场景加载成功,再卸载旧场景
if (!string.IsNullOrEmpty(_currentRoomScene) && _currentHandle.IsValid())
{
var unloadOp = Addressables.UnloadSceneAsync(_currentHandle);
yield return unloadOp;
}
// 加载新场景Additive
var loadOp = Addressables.LoadSceneAsync(request.SceneName, LoadSceneMode.Additive);
yield return loadOp;
if (loadOp.Status == AsyncOperationStatus.Succeeded)
{
_currentHandle = loadOp;
_currentRoomScene = request.SceneName;
_onSceneLoaded?.Raise(request.SceneName);
}
else
{
Debug.LogError($"[SceneLoader] 加载场景失败:{request.SceneName}");
}
_currentHandle = loadOp;
_currentRoomScene = request.SceneName;
_onSceneLoaded?.Raise(request.SceneName);
}
/// <summary>手动卸载当前房间场景(供 SceneService 调用)。</summary>