Files
zeling_v2/Assets/Scripts/Core/SceneLoader.cs
2026-05-08 11:04:00 +08:00

78 lines
2.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
{
/// <summary>
/// Addressables 场景加载器Phase 0 骨架)。
/// 监听 EVT_SceneLoadRequestAdditive 加载指定场景,完成后发布 EVT_SceneLoaded。
/// Phase 1 完整实现由 SceneService 包装调用。
/// </summary>
[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<SceneInstance> _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}");
}
}
/// <summary>手动卸载当前房间场景(供 SceneService 调用)。</summary>
public IEnumerator UnloadCurrentCoroutine()
{
if (!_currentHandle.IsValid()) yield break;
var unloadOp = Addressables.UnloadSceneAsync(_currentHandle);
yield return unloadOp;
_currentRoomScene = null;
}
}
}