From d9c8e85f2b2da3a1f3356fcd7adfcc3b6c8e0963 Mon Sep 17 00:00:00 2001 From: bottlefish <781230111@qq.com> Date: Mon, 6 Jul 2026 20:21:52 +0800 Subject: [PATCH] =?UTF-8?q?fix(save):=20=E8=AF=BB=E6=A1=A3=E5=89=8D?= =?UTF-8?q?=E6=81=A2=E5=A4=8D=20timeScale=20=E5=B9=B6=E7=94=A8=20unscaledT?= =?UTF-8?q?ime=20=E6=B7=A1=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- Assets/Scripts/Framework/OtherKit/FadeKit.cs | 14 ++++++++++++-- .../Scripts/SaveSystem/SaveRestoreOrchestrator.cs | 13 ++++++++----- Assets/Scripts/UI/Panel/PlayToolPanel.cs | 8 ++++---- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/Assets/Scripts/Framework/OtherKit/FadeKit.cs b/Assets/Scripts/Framework/OtherKit/FadeKit.cs index 7e8001c68..7de1574e4 100644 --- a/Assets/Scripts/Framework/OtherKit/FadeKit.cs +++ b/Assets/Scripts/Framework/OtherKit/FadeKit.cs @@ -7,10 +7,15 @@ namespace AibisDream.Framework { public static class FadeKit { - public static IEnumerator FadeInAsync(this Image image, float duration) + public static IEnumerator FadeInAsync(this Image image, float duration, bool useUnscaledTime = false) { image.gameObject.SetActive(true); var tweener = image.DOBlendableColor(Color.white, duration); + if (useUnscaledTime) + { + tweener.SetUpdate(true); + } + yield return tweener.WaitForCompletion(); } @@ -20,10 +25,15 @@ namespace AibisDream.Framework var tweener = image.DOBlendableColor(Color.white, duration); } - public static IEnumerator FadeOutAsync(this Image image, float duration) + public static IEnumerator FadeOutAsync(this Image image, float duration, bool useUnscaledTime = false) { image.gameObject.SetActive(true); var tweener = image.DOBlendableColor(Color.clear, duration); + if (useUnscaledTime) + { + tweener.SetUpdate(true); + } + yield return tweener.WaitForCompletion(); image.gameObject.SetActive(false); } diff --git a/Assets/Scripts/SaveSystem/SaveRestoreOrchestrator.cs b/Assets/Scripts/SaveSystem/SaveRestoreOrchestrator.cs index 6441a5175..f4233de91 100644 --- a/Assets/Scripts/SaveSystem/SaveRestoreOrchestrator.cs +++ b/Assets/Scripts/SaveSystem/SaveRestoreOrchestrator.cs @@ -207,8 +207,8 @@ namespace AibisDream.SaveSystem try { - yield return FadeInForRestore(); PrepareGameSessionForRestore(); + yield return FadeInForRestore(); yield return RestoreLegacy(savePath); yield return null; FinalizeGameSessionAfterRestore(); @@ -239,10 +239,10 @@ namespace AibisDream.SaveSystem try { - yield return FadeInForRestore(); - PrepareGameSessionForRestore(); + yield return FadeInForRestore(); + SnapshotRegistry.EnsureInitialized(); yield return SnapshotRestore.RestoreState(YarnVariableStorage.Instance, snapshot, context); yield return SnapshotRestore.RestoreAnchor(snapshot, context); @@ -272,6 +272,9 @@ namespace AibisDream.SaveSystem { AddRestoreLog("Prepare game session for restore"); + // 读档淡入使用 DOTween(受 timeScale 影响);若处于暂停态须先恢复,否则 FadeIn 永不结束、画面卡在诊室/终端。 + Time.timeScale = 1f; + var gameManager = GameManager.Instance; if (gameManager != null && !gameManager.state.isInGame) { @@ -318,7 +321,7 @@ namespace AibisDream.SaveSystem var panel = UIManager.Instance?.GetPanel(); if (panel != null) { - yield return panel.FadeInAsync(RestoreFadeDuration); + yield return panel.FadeInAsync(RestoreFadeDuration, useUnscaledTime: true); } } @@ -328,7 +331,7 @@ namespace AibisDream.SaveSystem var panel = UIManager.Instance?.GetPanel(); if (panel != null) { - yield return panel.FadeOutAsync(RestoreFadeDuration); + yield return panel.FadeOutAsync(RestoreFadeDuration, useUnscaledTime: true); } } diff --git a/Assets/Scripts/UI/Panel/PlayToolPanel.cs b/Assets/Scripts/UI/Panel/PlayToolPanel.cs index a7a867873..ae9383823 100644 --- a/Assets/Scripts/UI/Panel/PlayToolPanel.cs +++ b/Assets/Scripts/UI/Panel/PlayToolPanel.cs @@ -65,14 +65,14 @@ namespace AibisDream.UI : picName; } - public IEnumerator FadeInAsync(float duration = 1) + public IEnumerator FadeInAsync(float duration = 1, bool useUnscaledTime = false) { - return _fadeImage.FadeInAsync(duration); + return _fadeImage.FadeInAsync(duration, useUnscaledTime); } - public IEnumerator FadeOutAsync(float duration = 1) + public IEnumerator FadeOutAsync(float duration = 1, bool useUnscaledTime = false) { - return _fadeImage.FadeOutAsync(duration); + return _fadeImage.FadeOutAsync(duration, useUnscaledTime); } public void FadeInSync(float duration = 1)