fix(enemy): GroundNavigator 停止改为直写移动输入,消除与 EnemyBase.StopMovement 的无限递归(栈溢出)
This commit is contained in:
@@ -71,7 +71,21 @@ namespace BaseGames.Enemies.Navigation
|
|||||||
_hasTarget = false;
|
_hasTarget = false;
|
||||||
_arrived = false;
|
_arrived = false;
|
||||||
_blocked = 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);
|
public void SetSpeed(float speed) => _speed = Mathf.Max(0f, speed);
|
||||||
@@ -95,7 +109,7 @@ namespace BaseGames.Enemies.Navigation
|
|||||||
if (Arrived(bodyX, _target.x, _stoppingDistance))
|
if (Arrived(bodyX, _target.x, _stoppingDistance))
|
||||||
{
|
{
|
||||||
_arrived = true;
|
_arrived = true;
|
||||||
if (_enemy != null) _enemy.StopMovement();
|
HaltMovement();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,7 +119,7 @@ namespace BaseGames.Enemies.Navigation
|
|||||||
if (_movement.IsGrounded && _movement.WouldBlockAhead(dir))
|
if (_movement.IsGrounded && _movement.WouldBlockAhead(dir))
|
||||||
{
|
{
|
||||||
_blocked = true;
|
_blocked = true;
|
||||||
if (_enemy != null) _enemy.StopMovement();
|
HaltMovement();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -117,7 +131,7 @@ namespace BaseGames.Enemies.Navigation
|
|||||||
if (_stall.Tick(bodyX, Time.fixedDeltaTime))
|
if (_stall.Tick(bodyX, Time.fixedDeltaTime))
|
||||||
{
|
{
|
||||||
_blocked = true;
|
_blocked = true;
|
||||||
if (_enemy != null) _enemy.StopMovement();
|
HaltMovement();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user