fix(enemy): 配方校验改用一次性 builder 探测,不再干扰共享图缓存

This commit is contained in:
2026-07-30 08:33:53 +08:00
parent da217af113
commit afcc0b10ee
3 changed files with 25 additions and 9 deletions
@@ -46,19 +46,24 @@ namespace BaseGames.Enemies
yield return ValidationResult.Error($"{who}:未选择交战层模块。");
if (_unaware == null || _engagement == null) yield break;
bool moduleHasError = false;
foreach (var r in _engagement.Validate())
{
if (r.Severity == ValidationSeverity.Error) moduleHasError = true;
yield return new ValidationResult(r.Severity, $"{who}{r.Message}");
}
if (moduleHasError) yield break; // 模块层已定位到问题,探测只会重复同一条
// 结构性校验:直接试建一次图,模块与骨架的建图期守卫会把问题抛出来
// 结构性校验:用一次性 builder 试建,模块与骨架的建图期守卫会把问题抛出来
// (能力漏配、Rest 不在 States、态未声明、跨模块状态名冲突等)。
// 这是最彻底的检查——凡是运行时会炸的,这里就会炸。
// 走 ProbeBuild 而非 GetOrBuildGraph:后者在缓存已热时会跳过 Build(等于没探测),
// 且事后置空缓存会破坏 flyweight 不变量。
ValidationResult? buildFailure = null;
try { GetOrBuildGraph(); }
try { ProbeBuild(); }
catch (System.Exception e)
{
buildFailure = ValidationResult.Error($"{who}:建图失败 —— {e.Message}");
}
finally { InvalidateGraph(); } // 校验期建的图不留给运行时
if (buildFailure.HasValue) yield return buildFailure.Value;
}