From 3775aed368f7c6b9b42f965375bd33f00ad63a8f Mon Sep 17 00:00:00 2001 From: Ding Yuntian <1491671119@qq.com> Date: Mon, 29 Jun 2026 15:59:21 +0800 Subject: [PATCH] =?UTF-8?q?feat(save):=20=E6=94=AF=E6=8C=81=E6=97=A0?= =?UTF-8?q?=E8=8A=82=E7=82=B9=20anchor=20=E6=81=A2=E5=A4=8D=E4=B8=8E?= =?UTF-8?q?=E5=BB=B6=E8=BF=9F=E5=B1=8F=E5=B9=95=E9=81=AE=E7=BD=A9=E5=BA=94?= =?UTF-8?q?=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SaveSystem/SaveRestoreOrchestrator.cs | 4 +++- .../SaveSystem/ScreenSnapshotHelper.cs | 23 +++++++++++++++++++ Assets/Scripts/SaveSystem/SnapshotRestore.cs | 21 ++++++++++++----- 3 files changed, 41 insertions(+), 7 deletions(-) diff --git a/Assets/Scripts/SaveSystem/SaveRestoreOrchestrator.cs b/Assets/Scripts/SaveSystem/SaveRestoreOrchestrator.cs index 9abdf4728..238f87c64 100644 --- a/Assets/Scripts/SaveSystem/SaveRestoreOrchestrator.cs +++ b/Assets/Scripts/SaveSystem/SaveRestoreOrchestrator.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections; using System.Collections.Generic; using AibisDream.Framework; @@ -208,6 +208,7 @@ namespace AibisDream.SaveSystem yield return null; FinalizeGameSessionAfterRestore(); yield return FadeOutForRestore(); + ScreenSnapshotHelper.ApplyDeferredFadeScreenIfNeeded(); } finally { @@ -247,6 +248,7 @@ namespace AibisDream.SaveSystem FinalizeGameSessionAfterRestore(); yield return FadeOutForRestore(); + ScreenSnapshotHelper.ApplyDeferredFadeScreenIfNeeded(); } finally { diff --git a/Assets/Scripts/SaveSystem/ScreenSnapshotHelper.cs b/Assets/Scripts/SaveSystem/ScreenSnapshotHelper.cs index 75d0c44f7..c7d0a073c 100644 --- a/Assets/Scripts/SaveSystem/ScreenSnapshotHelper.cs +++ b/Assets/Scripts/SaveSystem/ScreenSnapshotHelper.cs @@ -10,6 +10,9 @@ namespace AibisDream.SaveSystem /// public static class ScreenSnapshotHelper { + private static bool _hasDeferredFadeScreenCovered; + private static bool _deferredFadeScreenCovered; + public static ScreenSnapshotDto Capture() { var dto = new ScreenSnapshotDto(); @@ -42,9 +45,29 @@ namespace AibisDream.SaveSystem if (UIManager.Instance != null) { + if (SaveRestoreOrchestrator.IsRestoring) + { + _hasDeferredFadeScreenCovered = true; + _deferredFadeScreenCovered = dto.isFadeScreenCovered; + return; + } + var panel = UIManager.Instance.GetPanel(); panel?.ApplyFadeScreenCovered(dto.isFadeScreenCovered); } } + + /// 读档 FadeOut 完成后应用延迟的遮罩终态。 + public static void ApplyDeferredFadeScreenIfNeeded() + { + if (!_hasDeferredFadeScreenCovered) + { + return; + } + + _hasDeferredFadeScreenCovered = false; + var panel = UIManager.Instance?.GetPanel(); + panel?.ApplyFadeScreenCovered(_deferredFadeScreenCovered); + } } } diff --git a/Assets/Scripts/SaveSystem/SnapshotRestore.cs b/Assets/Scripts/SaveSystem/SnapshotRestore.cs index 79ddebd02..ecf97667a 100644 --- a/Assets/Scripts/SaveSystem/SnapshotRestore.cs +++ b/Assets/Scripts/SaveSystem/SnapshotRestore.cs @@ -39,30 +39,34 @@ namespace AibisDream.SaveSystem } /// - /// Phase 3:按 加载对话工程并重新进入 Yarn 节点。 + /// Phase 3:按 加载对话工程;若有节点名则重新进入 Yarn 节点。 /// public static IEnumerator RestoreAnchor(SaveSnapshot snapshot, SnapshotRestoreContext context = null) { - if (snapshot?.anchor == null || string.IsNullOrEmpty(snapshot.anchor.nodeName)) + if (snapshot?.anchor == null) { - context?.Log("Phase 3: No anchor node, skip RestoreAnchor"); + context?.Log("Phase 3: No anchor, skip RestoreAnchor"); yield break; } context ??= new SnapshotRestoreContext(snapshot); - context.Log($"Phase 3: Restore anchor {snapshot.anchor.nodeName}"); + + var hasNode = !string.IsNullOrEmpty(snapshot.anchor.nodeName); + context.Log(hasNode + ? $"Phase 3: Restore anchor {snapshot.anchor.nodeName}" + : "Phase 3: No anchor node, restore YarnProject only"); var dialog = DialogController.Instance; if (dialog == null) { - context.Warn("DialogController 未初始化,无法重进 Yarn 节点。"); + context.Warn("DialogController 未初始化,无法恢复 Yarn 状态。"); yield break; } var runner = dialog.DialogueRunner; if (runner == null) { - context.Warn("DialogueRunner 未初始化,无法重进 Yarn 节点。"); + context.Warn("DialogueRunner 未初始化,无法恢复 Yarn 状态。"); yield break; } @@ -83,6 +87,11 @@ namespace AibisDream.SaveSystem } } + if (!hasNode) + { + yield break; + } + if (runner.IsDialogueRunning) { yield return runner.Stop();