using System; using UnityEngine; namespace BaseGames.Enemies { // ── 连接段类型(映射 PB2d LinkTypeName 字符串)─────────────────────── public enum NavLinkType { None, Segment, // 普通地面/平台段 Jump, Fall, Corner, Climb, Elevator, Teleport, Custom } /// /// 导航代理抽象接口(架构 07_EnemyModule §5)。 /// EnemyBase 和 BD Task 只依赖此接口,不依赖具体导航库。 /// 实现:EnemyNavAgent(PathBerserker2d);测试用 NullPathAgent。 /// public interface IPathAgent { // ── 核心移动 ──────────────────────────────────────────────────── /// 请求移动到世界坐标 target。 void RequestMoveTo(Vector2 target); /// 立即停止导航(清除路径)。 void StopNavigation(); /// 是否已到达目标(距离 ≤ stoppingDistance)。 bool IsAtDestination(); /// 运行时覆盖移动速度。 void SetSpeed(float speed); /// 当前帧是否在移动(速度 > 0.01 且有有效路径)。 bool IsMoving { get; } /// 是否接近平台边缘(脚下或前方无地面时为 true)。 bool IsNearEdge(); // ── 连接段感知(NavLink 平台跳跃/爬梯/传送)───────────────────── /// 当前是否正在穿越连接段(跳跃/下落/爬梯等)。 bool IsOnLink { get; } /// 当前正在穿越的连接段类型;不在连接段时为 None。 NavLinkType CurrentLinkType { get; } /// 当前连接段的起始世界坐标;不在连接段时为 Vector2.zero。 Vector2 CurrentLinkStart { get; } /// 当前连接段的目标世界坐标;不在连接段时为 Vector2.zero。 Vector2 CurrentLinkEnd { get; } /// 检查目标是否可以从当前位置导航到达(同步轻量查询)。 bool CanReach(Vector2 target); /// 移动到随机可到达点(巡逻 fallback)。 bool WalkToRandom(); // ── 连接段事件 ────────────────────────────────────────────────── /// 开始穿越连接段时触发(传入连接段类型)。 event Action OnLinkStarted; /// 连接段穿越完成时触发。 event Action OnLinkCompleted; /// 路径寻路失败事件(目标不可达时触发)。 event Action OnNavPathFailed; /// 到达目标事件(替代轮询 IsAtDestination)。 event Action OnGoalReached; } // ── 无导航 / 测试用空实现 ───────────────────────────────────────────── public sealed class NullPathAgent : IPathAgent { public void RequestMoveTo(Vector2 _) { } public void StopNavigation() { } public bool IsAtDestination() => true; public void SetSpeed(float _) { } public bool IsMoving => false; public bool IsNearEdge() => false; public bool IsOnLink => false; public NavLinkType CurrentLinkType => NavLinkType.None; public Vector2 CurrentLinkStart => Vector2.zero; public Vector2 CurrentLinkEnd => Vector2.zero; public bool CanReach(Vector2 _) => false; public bool WalkToRandom() => false; public event Action OnLinkStarted { add { } remove { } } public event Action OnLinkCompleted{ add { } remove { } } public event Action OnNavPathFailed { add { } remove { } } public event Action OnGoalReached { add { } remove { } } } }