diff --git a/Assets/Tests/EditMode/AI/ApproachAttackEngagementTests.cs b/Assets/Tests/EditMode/AI/ApproachAttackEngagementTests.cs index 214e2605..724e5edc 100644 --- a/Assets/Tests/EditMode/AI/ApproachAttackEngagementTests.cs +++ b/Assets/Tests/EditMode/AI/ApproachAttackEngagementTests.cs @@ -76,6 +76,9 @@ namespace BaseGames.Tests.EditMode.AI Assert.AreEqual(ApproachAttackEngagement.Attack, rt.CurrentStateName); ctx.S.Chase = false; ctx.S.Vision = false; // 前摇中玩家跑掉 + // 真实系统里攻击射程远小于感知区,脱离全部感知区必然也脱离攻击射程, + // HasEligibleAttack() 会随之变假。FakeCombat.Eligible 是裸字段不会联动,这里手工对齐。 + ctx.C.Eligible = false; rt.Tick(0.1f); Assert.AreEqual(ApproachAttackEngagement.Attack, rt.CurrentStateName); // 不中途收招 diff --git a/Assets/_Game/Scripts/Enemies/AIBrain/Modules/Engagement/ApproachAttackEngagement.cs b/Assets/_Game/Scripts/Enemies/AIBrain/Modules/Engagement/ApproachAttackEngagement.cs index 8472fc5a..e473322f 100644 --- a/Assets/_Game/Scripts/Enemies/AIBrain/Modules/Engagement/ApproachAttackEngagement.cs +++ b/Assets/_Game/Scripts/Enemies/AIBrain/Modules/Engagement/ApproachAttackEngagement.cs @@ -25,10 +25,8 @@ namespace BaseGames.Enemies .OnEnter(x => x.Locomotion.Pursue(x.Sensor.LastKnown)) .Tick (x => x.Locomotion.Pursue(x.Sensor.LastKnown)) .OnExit(x => x.Locomotion.Stop()) - // 脱战边放在前面:脱战判定优先于是否有合格攻击,避免"已经脱离全部感知区, - // 却因为攻击选择器还没来得及清掉合格标记"而卡在交战里出不去。 - .To(rest) .When(AiStateFragments.LostAllZones, "leftAllZones") - .To(Attack).When(x => x.Combat.HasEligibleAttack(), "attackInRange"); + .To(Attack).When(x => x.Combat.HasEligibleAttack(), "attackInRange") + .To(rest) .When(AiStateFragments.LostAllZones, "leftAllZones"); // 攻击一旦起手就打完:刻意不挂 leftAllZones 边。 // 玩家在前摇中跑出感知区时招式仍完整打完,之后经 Approach 自然脱战——