From 219fe4671938ce880d29d6419317f25a3835b316 Mon Sep 17 00:00:00 2001 From: Joywayer Date: Tue, 28 Jul 2026 11:39:25 +0800 Subject: [PATCH] =?UTF-8?q?fix(enemy):=20GroundNavigator=20=E5=81=9C?= =?UTF-8?q?=E6=AD=A2=E6=94=B9=E4=B8=BA=E7=9B=B4=E5=86=99=E7=A7=BB=E5=8A=A8?= =?UTF-8?q?=E8=BE=93=E5=85=A5,=E6=B6=88=E9=99=A4=E4=B8=8E=20EnemyBase.Stop?= =?UTF-8?q?Movement=20=E7=9A=84=E6=97=A0=E9=99=90=E9=80=92=E5=BD=92(?= =?UTF-8?q?=E6=A0=88=E6=BA=A2=E5=87=BA)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Enemies/Navigation/GroundNavigator.cs | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/Assets/_Game/Scripts/Enemies/Navigation/GroundNavigator.cs b/Assets/_Game/Scripts/Enemies/Navigation/GroundNavigator.cs index 8cf568ff..45ee2a1e 100644 --- a/Assets/_Game/Scripts/Enemies/Navigation/GroundNavigator.cs +++ b/Assets/_Game/Scripts/Enemies/Navigation/GroundNavigator.cs @@ -71,7 +71,21 @@ namespace BaseGames.Enemies.Navigation _hasTarget = false; _arrived = false; _blocked = false; - if (_enemy != null) _enemy.StopMovement(); + HaltMovement(); + } + + /// + /// 停下水平移动。 + /// ⚠ 必须直接写移动层输入,**不可**回调 —— + /// 后者会调用 Nav.Stop(),与本导航器互相调用造成无限递归(栈溢出)。 + /// 分层方向只允许 导航器 → 移动层,不允许反向回调。 + /// + private void HaltMovement() + { + if (_movement == null) return; + _movement.PendingInput.MoveDir = 0f; + _movement.PendingInput.MoveSpeed = 0f; + _movement.PendingInput.WantStop = true; } public void SetSpeed(float speed) => _speed = Mathf.Max(0f, speed); @@ -95,7 +109,7 @@ namespace BaseGames.Enemies.Navigation if (Arrived(bodyX, _target.x, _stoppingDistance)) { _arrived = true; - if (_enemy != null) _enemy.StopMovement(); + HaltMovement(); return; } @@ -105,7 +119,7 @@ namespace BaseGames.Enemies.Navigation if (_movement.IsGrounded && _movement.WouldBlockAhead(dir)) { _blocked = true; - if (_enemy != null) _enemy.StopMovement(); + HaltMovement(); return; } @@ -117,7 +131,7 @@ namespace BaseGames.Enemies.Navigation if (_stall.Tick(bodyX, Time.fixedDeltaTime)) { _blocked = true; - if (_enemy != null) _enemy.StopMovement(); + HaltMovement(); } }