feat(ai): BrainBuilder.DeclareState——重复声明状态即报错,防模块间同名静默覆盖
State() 仍保持宽松(有则取),用于给已声明的态挂边;DeclareState() 只用于 首次声明行为,重复声明同名状态会抛异常。AiStateFragments 的四个建态原语 (Locomotion/Ability/AbilityOnce/Terminal)改用 DeclareState。同时给 IEngagementModule/IDeathModule/IUnawareModule 补充不变量说明。
This commit is contained in:
@@ -15,7 +15,7 @@ namespace BaseGames.Enemies
|
||||
|
||||
/// <summary>由 EnemyLocomotion 驱动的态:进入 / 每帧声明移动意图,离开时停。</summary>
|
||||
public static BrainBuilder.StateBuilder Locomotion(BrainBuilder b, string state, LocomotionMode mode)
|
||||
=> b.State(state)
|
||||
=> b.DeclareState(state)
|
||||
.OnEnter(x => ApplyLocomotion(x, mode))
|
||||
.Tick (x => ApplyLocomotion(x, mode))
|
||||
.OnExit(x => x.Locomotion.Stop());
|
||||
@@ -27,7 +27,7 @@ namespace BaseGames.Enemies
|
||||
public static BrainBuilder.StateBuilder Ability(BrainBuilder b, string state, string abilityId)
|
||||
{
|
||||
RequireAbilityId(state, abilityId);
|
||||
return b.State(state)
|
||||
return b.DeclareState(state)
|
||||
.OnEnter(x => EnsureAbility(x, abilityId))
|
||||
.Tick (x => EnsureAbility(x, abilityId))
|
||||
.OnExit(x => x.Combat.InterruptAbilities());
|
||||
@@ -40,7 +40,7 @@ namespace BaseGames.Enemies
|
||||
public static BrainBuilder.StateBuilder AbilityOnce(BrainBuilder b, string state, string abilityId)
|
||||
{
|
||||
RequireAbilityId(state, abilityId);
|
||||
return b.State(state).OnEnter(x => EnsureAbility(x, abilityId));
|
||||
return b.DeclareState(state).OnEnter(x => EnsureAbility(x, abilityId));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -48,7 +48,7 @@ namespace BaseGames.Enemies
|
||||
/// 用于"死亡演出交给物理状态机(EnemyBase.PerformDeath)"的敌人。
|
||||
/// </summary>
|
||||
public static BrainBuilder.StateBuilder Terminal(BrainBuilder b, string state)
|
||||
=> b.State(state);
|
||||
=> b.DeclareState(state);
|
||||
|
||||
static void ApplyLocomotion(IAiContext x, LocomotionMode mode)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user