Files
zeling_v2/Assets/Scripts/Core/SceneService.cs
2026-05-13 09:19:54 +08:00

80 lines
2.6 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 BaseGames.Core.Assets;
using BaseGames.Core.Events;
namespace BaseGames.Core
{
/// <summary>
/// 场景管理服务接口。
/// </summary>
public interface ISceneService
{
/// <summary>异步加载指定场景Additive。</summary>
IEnumerator LoadSceneCoroutine(SceneLoadRequest request);
/// <summary>卸载当前房间场景(保留 Persistent。</summary>
IEnumerator UnloadCurrentRoomCoroutine();
/// <summary>加载主菜单。</summary>
IEnumerator LoadMainMenuCoroutine();
}
/// <summary>
/// 场景管理服务。
/// </summary>
[DefaultExecutionOrder(-900)]
public class SceneService : MonoBehaviour, ISceneService
{
[Header("Event Channels - Listen")]
[SerializeField] private SceneLoadRequestEventChannelSO _onSceneLoadRequest;
[Header("Event Channels - Raise")]
[SerializeField] private VoidEventChannelSO _onFadeInRequest;
[SerializeField] private VoidEventChannelSO _onFadeOutRequest;
[SerializeField] private SceneLoader _sceneLoader;
[SerializeField] private float _fadeDuration = 0.3f;
private readonly CompositeDisposable _subscriptions = new();
private void OnEnable()
{
_onSceneLoadRequest?.Subscribe(HandleSceneLoadRequest).AddTo(_subscriptions);
}
private void OnDisable() => _subscriptions.Clear();
private void HandleSceneLoadRequest(SceneLoadRequest request)
=> StartCoroutine(LoadSceneCoroutine(request));
public IEnumerator LoadSceneCoroutine(SceneLoadRequest request)
{
_onFadeOutRequest?.Raise();
yield return new WaitForSeconds(_fadeDuration);
if (_sceneLoader != null)
yield return StartCoroutine(_sceneLoader.LoadSceneCoroutine(request));
else
Debug.LogError("[SceneService] _sceneLoader 未赋值,场景加载中断。请在 Inspector 中绑定 SceneLoader 组件。");
_onFadeInRequest?.Raise();
}
public IEnumerator UnloadCurrentRoomCoroutine()
{
if (_sceneLoader != null)
yield return StartCoroutine(_sceneLoader.UnloadCurrentCoroutine());
}
public IEnumerator LoadMainMenuCoroutine()
{
yield return LoadSceneCoroutine(new SceneLoadRequest
{
SceneName = AddressKeys.SceneMainMenu,
EntryTransitionId = null,
ShowLoadingScreen = false,
IsRespawn = false
});
}
}
}