From d6912fb1a6da421d4f6376efb7114c452b8ad009 Mon Sep 17 00:00:00 2001 From: Ding Yuntian <1491671119@qq.com> Date: Fri, 12 Jun 2026 17:41:10 +0800 Subject: [PATCH] =?UTF-8?q?feat(save):=20=E8=BF=81=E7=A7=BB=E5=AD=98?= =?UTF-8?q?=E8=AF=BB=E6=A1=A3=E5=85=A5=E5=8F=A3=E5=88=B0=E6=A7=BD=E4=BD=8D?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将游戏流程接入 P2 槽位层: - SaveRestoreOrchestrator:SaveToAutoSlot / CreateManualSlot / RestoreFromSlot - GameManager:<> 调用新入口,新增 StartWithSlot 读档入口 保留 RestoreFromFile 旧档兼容路径。 --- Assets/Scripts/Game Loop/GameManager.cs | 17 ++++++- .../SaveSystem/SaveRestoreOrchestrator.cs | 47 +++++++++++++++---- 2 files changed, 54 insertions(+), 10 deletions(-) diff --git a/Assets/Scripts/Game Loop/GameManager.cs b/Assets/Scripts/Game Loop/GameManager.cs index 8e763b2b1..e01d8d348 100644 --- a/Assets/Scripts/Game Loop/GameManager.cs +++ b/Assets/Scripts/Game Loop/GameManager.cs @@ -37,7 +37,7 @@ namespace AibisDream { // 管理游戏开始时各部分的初始化 SettingLoader.Init(); - SnapshotBootstrap.EnsureInitialized(); + SnapshotRegistry.EnsureInitialized(); // 场景So事件注册 _currentTalkSceneSo = new BindProperty(); @@ -114,11 +114,24 @@ namespace AibisDream StartCoroutine(LoadFromSaveFile(fileName)); } + public void StartWithSlot(int slotIndex) + { + // 游戏开始 + EnumEventSystem.Global.Send(GameLoopEnum.GameStart); + + StartCoroutine(LoadFromSlot(slotIndex)); + } + private IEnumerator LoadFromSaveFile(string fileName) { yield return SaveRestoreOrchestrator.RestoreFromFile(fileName); } + private IEnumerator LoadFromSlot(int slotIndex) + { + yield return SaveRestoreOrchestrator.RestoreFromSlot(slotIndex); + } + private IEnumerator LoadFirstScene() { ChapterController.Instance.UnlockChapter(_currentTalkSceneSo.Value); @@ -348,7 +361,7 @@ namespace AibisDream [YarnCommand("auto_save")] public static void AutoSave() { - SaveRestoreOrchestrator.SaveToTestPath(); + SaveRestoreOrchestrator.SaveToAutoSlot(); } } diff --git a/Assets/Scripts/SaveSystem/SaveRestoreOrchestrator.cs b/Assets/Scripts/SaveSystem/SaveRestoreOrchestrator.cs index 15f485554..509320445 100644 --- a/Assets/Scripts/SaveSystem/SaveRestoreOrchestrator.cs +++ b/Assets/Scripts/SaveSystem/SaveRestoreOrchestrator.cs @@ -1,4 +1,4 @@ -using System.Collections; +using System.Collections; using System.Collections.Generic; using AibisDream.Framework; using AibisDream.Kit; @@ -9,16 +9,18 @@ using UnityEngine; namespace AibisDream.SaveSystem { /// - /// 存读档流程编排层:连接 UI、。 + /// 存读档流程编排层:连接 UI、 与槽位系统。 /// - /// 对外入口:(<>)、(读档)。 - /// P4 在此扩展淡入淡出与完整时序;P2 将替换测试路径为槽位 API。 + /// 对外入口:(<<auto_save>>)、 + /// (手动存档)、 + /// (读档)、 + /// (旧档/调试)。 /// /// public static class SaveRestoreOrchestrator { - /// 捕获快照并写入 P1 测试路径;含保存 Loading UI。 - public static void SaveToTestPath() + /// 捕获快照并写入自动档(slot 0);含保存 Loading UI。 + public static void SaveToAutoSlot() { var host = YarnVariableStorage.Instance; if (host == null) @@ -36,10 +38,30 @@ namespace AibisDream.SaveSystem using (new CodeTimer("SaveSnapshot")) { var snapshot = SnapshotService.Capture(); - SnapshotPersistence.Save(snapshot, SnapshotPersistence.GetTestFilePath()); + var thumbnail = SlotThumbnailCapture.CapturePng(); + SlotManager.SaveToAutoSlot(snapshot, thumbnail); } } + /// 将当前自动档复制到指定手动档。 + public static void CreateManualSlot(int slotIndex) + { + SlotManager.CopyAutoToManual(slotIndex); + } + + /// 从指定槽位读档并还原。 + public static IEnumerator RestoreFromSlot(int slotIndex) + { + var snapshot = SlotManager.LoadSnapshot(slotIndex); + if (snapshot == null) + { + Debug.LogError($"[SaveRestoreOrchestrator] 槽位 {slotIndex} 不存在或读取失败"); + yield break; + } + + yield return RestoreSnapshot(snapshot); + } + /// 从文件读档并还原;自动区分新快照格式与 legacy 格式。 public static IEnumerator RestoreFromFile(string savePath) { @@ -56,7 +78,7 @@ namespace AibisDream.SaveSystem snapshot = SnapshotPersistence.Load(savePath); } - yield return SnapshotService.Restore(snapshot); + yield return RestoreSnapshot(snapshot); } /// 旧档:Yarn 变量 + DeepRepairDataRegistry systemData。 @@ -72,6 +94,15 @@ namespace AibisDream.SaveSystem { yield return DeepRepairDataRegistry.LoadByJson(systemDataJson); } + + // 旧档还原后自动固化为新格式,方便后续使用槽位系统 + var snapshot = SnapshotService.Capture(); + SlotManager.SaveToAutoSlot(snapshot, null); + } + + private static IEnumerator RestoreSnapshot(SaveSnapshot snapshot) + { + yield return SnapshotService.Restore(snapshot); } } }