diff --git a/Assets/_Game/Scripts/Enemies/Navigation/EnemyLocomotion.cs b/Assets/_Game/Scripts/Enemies/Navigation/EnemyLocomotion.cs index 2a1dca90..479450ba 100644 --- a/Assets/_Game/Scripts/Enemies/Navigation/EnemyLocomotion.cs +++ b/Assets/_Game/Scripts/Enemies/Navigation/EnemyLocomotion.cs @@ -26,6 +26,7 @@ namespace BaseGames.Enemies private LocomotionMode _gaitMode; private bool _gaitInit; private float _paceDir = 1f; + private bool _paceBlockedPrev; private int _wpIndex = -1; private int _wpDir = 1; private bool _warnedNoWaypoints; @@ -113,7 +114,12 @@ namespace BaseGames.Enemies case PatrolStrategy.Pace: // 撞墙/悬崖翻向的来回踱步(速度驱动,不依赖 nav) var mv = _enemy.Movement; - if (mv != null && (mv.IsWallAhead || mv.IsLedgeAhead)) _paceDir = -_paceDir; + bool blocked = mv != null && (mv.IsWallAhead || mv.IsLedgeAhead); + // 边沿触发:仅在"障碍首次出现"时翻向一次。TickPatrol 跑在 Update(可变帧率), + // 而 IsWallAhead/IsLedgeAhead 在 FixedUpdate 刷新——若用电平触发(每帧 blocked 就翻), + // 检测刷新前的多个 Update 帧会把同一障碍连翻多次→边缘左右抖动。 + if (blocked && !_paceBlockedPrev) _paceDir = -_paceDir; + _paceBlockedPrev = blocked; _enemy.MoveInDirection(_paceDir); break;