From 9d632cd103671071c41792f9858cf078a3409517 Mon Sep 17 00:00:00 2001 From: Joywayer Date: Wed, 29 Jul 2026 12:59:07 +0800 Subject: [PATCH] =?UTF-8?q?fix(enemy):=20=E9=80=80=E5=9B=9E=20Approach=20?= =?UTF-8?q?=E8=BE=B9=E5=BA=8F=E2=80=94=E2=80=94=E8=84=B1=E6=88=98=E4=BC=98?= =?UTF-8?q?=E5=85=88=E5=B1=9E=E5=81=87=E4=BB=B6=E5=A4=B1=E7=9C=9F=EF=BC=8C?= =?UTF-8?q?=E6=94=B9=E7=94=B1=E6=B5=8B=E8=AF=95=E8=B4=B4=E5=90=88=E7=9C=9F?= =?UTF-8?q?=E5=AE=9E=E5=B0=84=E7=A8=8B=E8=AF=AD=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit HasEligibleAttack() 只看攻击射程圆(远小于追击/视野区),脱离全部感知区在真实系统里 必然已脱离攻击射程,原顺序(attackInRange 先于 leftAllZones)本就正确。 FakeCombat.Eligible 是裸字段不会随 Chase/Vision 联动,才让上一版看似需要调边序。 改法:边序退回原样,测试里玩家离开感知区时手工同步清 Eligible,贴合真实耦合关系。 --- Assets/Tests/EditMode/AI/ApproachAttackEngagementTests.cs | 3 +++ .../AIBrain/Modules/Engagement/ApproachAttackEngagement.cs | 6 ++---- 2 files changed, 5 insertions(+), 4 deletions(-) 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 自然脱战——