fix(enemy): GroundNavigator 停止改为直写移动输入,消除与 EnemyBase.StopMovement 的无限递归(栈溢出)

This commit is contained in:
2026-07-28 11:39:25 +08:00
parent de3c9deff4
commit 219fe46719
@@ -71,7 +71,21 @@ namespace BaseGames.Enemies.Navigation
_hasTarget = false;
_arrived = false;
_blocked = false;
if (_enemy != null) _enemy.StopMovement();
HaltMovement();
}
/// <summary>
/// 停下水平移动。
/// <para>⚠ 必须直接写移动层输入,**不可**回调 <see cref="EnemyBase.StopMovement"/>——
/// 后者会调用 <c>Nav.Stop()</c>,与本导航器互相调用造成无限递归(栈溢出)。
/// 分层方向只允许 导航器 → 移动层,不允许反向回调。</para>
/// </summary>
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();
}
}