using System.Collections;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.ResourceManagement.ResourceProviders;
using UnityEngine.SceneManagement;
using BaseGames.Core.Events;
namespace BaseGames.Core
{
///
/// Addressables 场景加载器(Phase 0 骨架)。
/// 监听 EVT_SceneLoadRequest,Additive 加载指定场景,完成后发布 EVT_SceneLoaded。
/// Phase 1 完整实现由 SceneService 包装调用。
///
[DefaultExecutionOrder(-950)]
public class SceneLoader : MonoBehaviour
{
[Header("Event Channels - Listen")]
[SerializeField] private SceneLoadRequestEventChannelSO _onSceneLoadRequest;
[Header("Event Channels - Raise")]
[SerializeField] private StringEventChannelSO _onSceneLoaded;
private string _currentRoomScene;
private AsyncOperationHandle _currentHandle;
private void OnEnable()
{
if (_onSceneLoadRequest != null)
_onSceneLoadRequest.OnEventRaised += HandleRequest;
}
private void OnDisable()
{
if (_onSceneLoadRequest != null)
_onSceneLoadRequest.OnEventRaised -= HandleRequest;
}
private void HandleRequest(SceneLoadRequest request)
=> StartCoroutine(LoadSceneCoroutine(request));
private IEnumerator LoadSceneCoroutine(SceneLoadRequest request)
{
// 卸载旧场景
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}");
}
}
/// 手动卸载当前房间场景(供 SceneService 调用)。
public IEnumerator UnloadCurrentCoroutine()
{
if (!_currentHandle.IsValid()) yield break;
var unloadOp = Addressables.UnloadSceneAsync(_currentHandle);
yield return unloadOp;
_currentRoomScene = null;
}
}
}