chore: initial commit
This commit is contained in:
77
Assets/Scripts/Core/SceneLoader.cs
Normal file
77
Assets/Scripts/Core/SceneLoader.cs
Normal file
@@ -0,0 +1,77 @@
|
||||
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_SceneLoadRequest,Additive 加载指定场景,完成后发布 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user