feat(ai): BrainBuilder.DeclareState——重复声明状态即报错,防模块间同名静默覆盖

State() 仍保持宽松(有则取),用于给已声明的态挂边;DeclareState() 只用于
首次声明行为,重复声明同名状态会抛异常。AiStateFragments 的四个建态原语
(Locomotion/Ability/AbilityOnce/Terminal)改用 DeclareState。同时给
IEngagementModule/IDeathModule/IUnawareModule 补充不变量说明。
This commit is contained in:
2026-07-29 12:01:19 +08:00
parent 5dcbce6019
commit 80fdc36762
6 changed files with 56 additions and 5 deletions
+14
View File
@@ -39,6 +39,20 @@ namespace BaseGames.AI
$"BrainBuilder: 状态 '{name}' 尚未声明。请先声明它的行为(AiStateFragments.* 或 State(name)),再挂转换。");
}
/// <summary>
/// 首次声明一个状态。名字已存在即抛——防止两个独立模块取了同名状态时,
/// 后者的 OnEnter/Tick/OnExit 静默覆盖前者(敌人跑错行为且零报错)。
/// 只有"首次声明行为"的调用点用它;给已声明的态挂边仍用 State()。
/// </summary>
public StateBuilder DeclareState(string name)
{
if (_states.ContainsKey(name))
throw new InvalidOperationException(
$"BrainBuilder: 状态 '{name}' 已被声明过。两个模块取了同名状态会互相覆盖回调——" +
"请给其中一个换个不冲突的名字。");
return State(name);
}
internal void AddGlobal(Transition t) => _globals.Add(t);
public AiGraph Build()