feat: 添加场景过渡类型支持,优化场景加载逻辑

This commit is contained in:
2026-05-19 15:18:13 +08:00
parent be96b326de
commit ee0f659c97
12 changed files with 259 additions and 20 deletions

View File

@@ -56,6 +56,7 @@ namespace BaseGames.Core
{
SceneName = sm?.LastCheckpointScene,
EntryTransitionId = sm?.LastCheckpointSpawnId,
TransitionType = TransitionType.Scene,
ShowLoadingScreen = true,
IsRespawn = true,
});

View File

@@ -12,7 +12,10 @@ namespace BaseGames.Core.Events
public string EntryId;
/// <summary>玩家出生点 Transition ID具体过渡门 ID可为 null</summary>
public string EntryTransitionId;
/// <summary>是否显示加载画面</summary>
/// <summary>过渡类型,决定 <see cref="BaseGames.Core.SceneService"/> 的演出行为(淡出时长、加载画面等)。
/// 默认 <see cref="TransitionType.Room"/>,向后兼容旧请求。</summary>
public TransitionType TransitionType;
/// <summary>是否显示加载画面(由 TransitionType 自动推导,通常无需手动设置)。</summary>
public bool ShowLoadingScreen;
/// <summary>死亡复活时为 true不执行正常过渡动画</summary>
public bool IsRespawn;

View File

@@ -0,0 +1,16 @@
namespace BaseGames.Core.Events
{
/// <summary>
/// 场景过渡类型,决定 <see cref="BaseGames.Core.SceneService"/> 的演出行为。
/// </summary>
public enum TransitionType
{
/// <summary>同区域相邻房间切换。极短淡出≈0.05 s无加载画面相机硬切。
/// 适用于走廊边界、隐藏通道等玩家感知连续的场景边界。</summary>
Room,
/// <summary>跨大区域切换。完整淡出,显示加载画面。
/// 适用于地图间传送、返回标题、大区域入口等有明显空间跳跃感的切换。</summary>
Scene,
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7a9a71d44467e124ea9e7cda40603f30
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -19,7 +19,11 @@ namespace BaseGames.Core
}
/// <summary>
/// 场景管理服务。
/// 场景管理服务。根据 <see cref="SceneLoadRequest.TransitionType"/> 执行不同演出:
/// <list type="bullet">
/// <item><b>Room</b>:极短淡出(<see cref="_roomFadeDuration"/>),无加载画面。</item>
/// <item><b>Scene</b>:完整淡出(<see cref="_sceneFadeDuration"/>),显示加载画面。</item>
/// </list>
/// </summary>
[DefaultExecutionOrder(-900)]
public class SceneService : MonoBehaviour, ISceneService
@@ -32,7 +36,13 @@ namespace BaseGames.Core
[SerializeField] private VoidEventChannelSO _onFadeOutRequest;
[SerializeField] private SceneLoader _sceneLoader;
[SerializeField] private float _fadeDuration = 0.3f;
[Header("淡出时长")]
[Tooltip("Room 过渡:极短淡出,用于相邻房间边界切换(推荐 0.05 s。")]
[SerializeField] private float _roomFadeDuration = 0.05f;
[Tooltip("Scene 过渡:完整淡出,用于大区域/地图间切换(推荐 0.4 s。")]
[SerializeField] private float _sceneFadeDuration = 0.4f;
private readonly CompositeDisposable _subscriptions = new();
@@ -48,8 +58,13 @@ namespace BaseGames.Core
public IEnumerator LoadSceneCoroutine(SceneLoadRequest request)
{
float fadeDuration = request.TransitionType == TransitionType.Scene
? _sceneFadeDuration
: _roomFadeDuration;
_onFadeOutRequest?.Raise();
yield return new WaitForSeconds(_fadeDuration);
if (fadeDuration > 0f)
yield return new WaitForSeconds(fadeDuration);
if (_sceneLoader != null)
yield return StartCoroutine(_sceneLoader.LoadSceneCoroutine(request));
@@ -71,6 +86,7 @@ namespace BaseGames.Core
{
SceneName = AddressKeys.SceneMainMenu,
EntryTransitionId = null,
TransitionType = TransitionType.Scene,
ShowLoadingScreen = false,
IsRespawn = false
});