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(); } }