fix(save): 读档前恢复 timeScale 并用 unscaledTime 淡入

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-06 20:21:52 +08:00
co-authored by Cursor
parent b612a0763d
commit d9c8e85f2b
3 changed files with 24 additions and 11 deletions
+12 -2
View File
@@ -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);
}
@@ -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<PlayToolPanel>();
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<PlayToolPanel>();
if (panel != null)
{
yield return panel.FadeOutAsync(RestoreFadeDuration);
yield return panel.FadeOutAsync(RestoreFadeDuration, useUnscaledTime: true);
}
}
+4 -4
View File
@@ -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)