fix(enemy): GroundNavigator 停止改为直写移动输入,消除与 EnemyBase.StopMovement 的无限递归(栈溢出)
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user