From 67f3abd8258a5139820bf9aa0d246e937c4314c3 Mon Sep 17 00:00:00 2001 From: Ding Yuntian <1491671119@qq.com> Date: Mon, 29 Jun 2026 15:59:35 +0800 Subject: [PATCH] =?UTF-8?q?test(save):=20=E6=9B=B4=E6=96=B0=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E7=AA=97=E5=8F=A3=E6=A8=A1=E6=8B=9F=20OnNodeStart=20?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=A1=A3=E5=88=A4=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SaveSystemValidationWindow.cs | 57 +++++++++++++++++-- 1 file changed, 51 insertions(+), 6 deletions(-) diff --git a/Assets/Editor/SaveSystemValidation/SaveSystemValidationWindow.cs b/Assets/Editor/SaveSystemValidation/SaveSystemValidationWindow.cs index e9c4e5683..25c021ef7 100644 --- a/Assets/Editor/SaveSystemValidation/SaveSystemValidationWindow.cs +++ b/Assets/Editor/SaveSystemValidation/SaveSystemValidationWindow.cs @@ -315,8 +315,8 @@ namespace AibisDream.SaveSystem.Editor { EditorGUILayout.LabelField("可存点判定框架检查", EditorStyles.boldLabel); EditorGUILayout.HelpBox( - "手动设置节点名和 tags,测试 SavePointEvaluator.CanAutoSave 的判定结果。\n" + - "不涉及真实 DialogController,因此 IsRestoring/GamePaused 等状态仍按实际运行时取值。", + "手动设置节点名和 tags,模拟 OnNodeStart 自动档判定(含 DetourResume)。\n" + + "InProgress 来自运行时 DialogController;全局门控按实际 Play Mode 状态取值。", MessageType.None); _testNodeName = EditorGUILayout.TextField("节点名", _testNodeName); @@ -543,10 +543,42 @@ namespace AibisDream.SaveSystem.Editor try { - var result = SavePointEvaluator.CanAutoSave(out var reason); - Log($"CanAutoSave = {result}, Reason = {reason}\n" + - $"(当前 IsRestoring = {SaveRestoreOrchestrator.IsRestoring}, " + - $"GameManager.pause = {(GameManager.Instance != null ? GameManager.Instance.state.isInPause.ToString() : "N/A")})"); + var projectId = DialogController.Instance?.DialogueRunner?.YarnProject?.name; + var tags = ParseTestTags(_testTags); + var inProgress = SavePointEvaluator.InProgressNodeNames; + + if (SaveRestoreOrchestrator.IsAutoSaveSuppressed) + { + Log("全局门控: AutoSaveSuppressed"); + return; + } + + if (SaveRestoreOrchestrator.IsRestoring) + { + Log("全局门控: Restoring(读档重进走 OnRestoreEnterNode,不写盘)"); + return; + } + + if (GameManager.Instance != null && GameManager.Instance.state.isInPause) + { + Log("全局门控: GamePaused"); + return; + } + + var detourResume = !string.IsNullOrEmpty(_testNodeName) + && inProgress.Contains(_testNodeName); + var tagOk = SavePointEvaluator.EvaluateNodeTagsForAutoSave( + _testNodeName, tags, out var tagReason); + var wouldSave = !detourResume && tagOk; + + Log( + $"Project = {projectId ?? "(null)"}\n" + + $"InProgress = [{string.Join(", ", inProgress)}]\n" + + $"模拟节点 = {_testNodeName}, tags = [{string.Join(", ", tags)}]\n" + + $"DetourResume = {detourResume}\n" + + $"Tag 判定 = {tagOk}, TagReason = {tagReason}\n" + + $"OnNodeStart 会自动存 = {wouldSave}\n" + + $"(DialogController 当前上下文 CanAutoSave = {SavePointEvaluator.CanAutoSave(out var ctxReason)}, Reason = {ctxReason})"); } catch (Exception ex) { @@ -554,6 +586,19 @@ namespace AibisDream.SaveSystem.Editor } } + private static string[] ParseTestTags(string raw) + { + if (string.IsNullOrWhiteSpace(raw)) + { + return Array.Empty(); + } + + return raw.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) + .Select(tag => tag.Trim()) + .Where(tag => tag.Length > 0) + .ToArray(); + } + private void RestoreLatestSlot() { var latest = SlotManager.GetLatestSlotIndex();