using System; using UnityEngine; using Yarn.Unity; namespace AibisDream.SaveSystem { /// /// 从运行时组装 (纯内存,不写盘)。 /// /// 流程:元数据 → 场景 → 锚点(含宏观章节)→ Yarn 变量 → 各 Provider.Capture。 /// scene / anchor 由框架直管;其余子系统通过 Provider 写入 sections。 /// /// public static class SnapshotCapture { /// 捕获当前完整快照。调用前需已注册全部 provider。 public static SaveSnapshot Capture(YarnVariableStorage storage) { SnapshotRegistry.ValidateRequiredProviders(); var snapshot = new SaveSnapshot { gameVersion = Application.version, savedAt = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") }; CaptureScene(snapshot); CaptureAnchor(snapshot); CaptureYarnVariables(storage, snapshot); foreach (var provider in SnapshotRegistry.GetOrderedProviders()) { var dto = provider.Capture(); if (dto == null) continue; snapshot.sections[provider.SaveId] = dto; } return snapshot; } private static void CaptureScene(SaveSnapshot snapshot) { var sceneLoader = SceneLoader.Instance; snapshot.scene = new SceneSnapshotDto { sceneName = sceneLoader != null ? sceneLoader.CurrentSceneName : null }; } private static void CaptureAnchor(SaveSnapshot snapshot) { var dialog = DialogController.Instance; if (dialog == null) return; var (nodeName, _) = dialog.GetCurrentNodeContext(); var yarnProject = dialog.DialogueRunner?.YarnProject; var projectId = yarnProject != null ? yarnProject.name : string.Empty; var gameManager = GameManager.Instance; var sceneSoName = gameManager != null ? gameManager.GetSceneSoName() : null; snapshot.anchor = new AnchorSnapshot { sceneSoName = sceneSoName, yarnProjectId = projectId, nodeName = nodeName ?? string.Empty }; } private static void CaptureYarnVariables(YarnVariableStorage storage, SaveSnapshot snapshot) { var (floats, strings, bools) = storage.GetAllVariables(); snapshot.yarnVariables = new YarnVariablesSnapshot { floats = floats ?? new(), strings = strings ?? new(), bools = bools ?? new() }; } } }