diff --git a/Assets/Tests/EditMode/AI/Fakes/FakeLocomotion.cs b/Assets/Tests/EditMode/AI/Fakes/FakeLocomotion.cs index 1bd8e57e..d736a110 100644 --- a/Assets/Tests/EditMode/AI/Fakes/FakeLocomotion.cs +++ b/Assets/Tests/EditMode/AI/Fakes/FakeLocomotion.cs @@ -11,6 +11,7 @@ namespace BaseGames.Tests.EditMode.AI public bool IsMoving { get; set; } public void SetMode(LocomotionMode mode) { CurrentMode = mode; Calls.Add("SetMode:" + mode); } public void Approach(Transform t) { CurrentMode = LocomotionMode.Approach; Calls.Add("Approach"); } + public void Pursue(Vector2 p) { CurrentMode = LocomotionMode.Approach; Calls.Add("Pursue"); } public void MoveTo(Vector2 p) { Calls.Add("MoveTo"); } public void Face(Vector2 p) { CurrentMode = LocomotionMode.Face; Calls.Add("Face"); } public void Stop() { CurrentMode = LocomotionMode.Idle; Calls.Add("Stop"); } diff --git a/Assets/_Game/Scripts/AI/IEnemyLocomotion.cs b/Assets/_Game/Scripts/AI/IEnemyLocomotion.cs index f68c4c7a..833d7ebf 100644 --- a/Assets/_Game/Scripts/AI/IEnemyLocomotion.cs +++ b/Assets/_Game/Scripts/AI/IEnemyLocomotion.cs @@ -16,6 +16,7 @@ namespace BaseGames.AI { void SetMode(LocomotionMode mode); // Idle(停) / Patrol(按配置策略游走) void Approach(Transform target); // 持续跟随,派生 RunSpeed + void Pursue(Vector2 target); // 寻路逼近(RunSpeed):每帧朝 target 重寻路(底层防抖) void MoveTo(Vector2 point); // 一次性目标点 void Face(Vector2 lookAt); // 停 + 朝向 void Stop(); diff --git a/Assets/_Game/Scripts/Enemies/Navigation/EnemyLocomotion.cs b/Assets/_Game/Scripts/Enemies/Navigation/EnemyLocomotion.cs index 7b15f806..1a59ff27 100644 --- a/Assets/_Game/Scripts/Enemies/Navigation/EnemyLocomotion.cs +++ b/Assets/_Game/Scripts/Enemies/Navigation/EnemyLocomotion.cs @@ -84,6 +84,18 @@ namespace BaseGames.Enemies _enemy?.MoveTo(point); } + /// + /// 寻路逼近:设 Approach 模式 + RunSpeed,每帧朝 target 发一次寻路请求(底层 Nav 自带防抖/受阻/NavLink)。 + /// 与一次性 的区别:设跑速、语义为"持续追向移动目标"。供 AI 追击态每帧调用。 + /// + public void Pursue(Vector2 target) + { + _mode = LocomotionMode.Approach; + _approachTarget = null; + if (_enemy?.Stats != null) _enemy.Nav?.SetSpeed(_enemy.Stats.RunSpeed); + _enemy?.MoveTo(target); + } + public void Face(Vector2 lookAt) { _mode = LocomotionMode.Face;