test(save): 更新验证窗口模拟 OnNodeStart 自动档判定

This commit is contained in:
2026-06-29 15:59:35 +08:00
parent 3775aed368
commit 67f3abd825
@@ -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<string>();
}
return raw.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
.Select(tag => tag.Trim())
.Where(tag => tag.Length > 0)
.ToArray();
}
private void RestoreLatestSlot()
{
var latest = SlotManager.GetLatestSlotIndex();