feat: 添加场景过渡类型支持,优化场景加载逻辑
This commit is contained in:
@@ -56,6 +56,7 @@ namespace BaseGames.Core
|
||||
{
|
||||
SceneName = sm?.LastCheckpointScene,
|
||||
EntryTransitionId = sm?.LastCheckpointSpawnId,
|
||||
TransitionType = TransitionType.Scene,
|
||||
ShowLoadingScreen = true,
|
||||
IsRespawn = true,
|
||||
});
|
||||
|
||||
@@ -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;
|
||||
|
||||
16
Assets/_Game/Scripts/Core/Events/TransitionType.cs
Normal file
16
Assets/_Game/Scripts/Core/Events/TransitionType.cs
Normal 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,
|
||||
}
|
||||
}
|
||||
11
Assets/_Game/Scripts/Core/Events/TransitionType.cs.meta
Normal file
11
Assets/_Game/Scripts/Core/Events/TransitionType.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7a9a71d44467e124ea9e7cda40603f30
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user