diff --git a/Assets/_Game/Scripts/Enemies/IEnemyNavigator.cs b/Assets/_Game/Scripts/Enemies/IEnemyNavigator.cs
new file mode 100644
index 00000000..663c7d97
--- /dev/null
+++ b/Assets/_Game/Scripts/Enemies/IEnemyNavigator.cs
@@ -0,0 +1,53 @@
+using UnityEngine;
+
+namespace BaseGames.Enemies
+{
+ ///
+ /// 敌人导航抽象:把"去某个世界点"的请求翻译为具体移动方式(地面沿地形走 / 飞行直取),
+ /// 并报告到达与受阻。
+ ///
+ /// 不含任何路径图概念——可达性由移动层的墙/悬崖夹紧天然决定:
+ /// 走得过去就是可达,被夹停的地方就是边界。
+ ///
+ /// 实现:GroundNavigator(地面)、FlyingNavigator(飞行)、
+ /// (无导航/测试)。
+ ///
+ public interface IEnemyNavigator
+ {
+ ///
+ /// 请求朝世界坐标移动。目标被记录后由实现逐帧驱动,**重复传入同一目标是幂等的**
+ /// (每帧调用或只在目标变化时调用皆可)。传入新目标会清除 / 。
+ ///
+ void MoveTowards(Vector2 target);
+
+ /// 停止移动并清除当前目标。
+ void Stop();
+
+ /// 设置移动速度(巡逻走速 / 追击跑速)。传 0 表示使用移动层配置的默认步速。
+ void SetSpeed(float speed);
+
+ /// 当前是否正朝目标推进(有目标、未到达、未受阻)。
+ bool IsMoving { get; }
+
+ /// 是否已到达目标(进入停止距离内)。
+ bool HasArrived { get; }
+
+ /// 是否被地形挡住而无法继续靠近目标(墙 / 悬崖夹停 / 推进停滞)。
+ bool IsBlocked { get; }
+
+ /// 取一个可供游走的目标点。取不到时返回 false。
+ bool TryPickWanderPoint(out Vector2 point);
+ }
+
+ /// 无导航单位 / 测试用空实现:不移动,不报告到达或受阻。
+ public sealed class NullEnemyNavigator : IEnemyNavigator
+ {
+ public void MoveTowards(Vector2 _) { }
+ public void Stop() { }
+ public void SetSpeed(float _) { }
+ public bool IsMoving => false;
+ public bool HasArrived => false;
+ public bool IsBlocked => false;
+ public bool TryPickWanderPoint(out Vector2 point) { point = Vector2.zero; return false; }
+ }
+}