using UnityEngine;
using PathBerserker2d;
using BaseGames.Enemies;
namespace BaseGames.Enemies.Navigation
{
///
/// PathBerserker2d 导航代理包装器(架构 07_EnemyModule §5)。
/// 实现 IPathAgent 接口,使 EnemyBase 和 BD Task 无需直接依赖 PB2d 类型。
/// PB2d API:UpdatePath(Vector2)、Stop()、TransformBasedMovement.movementSpeed、IsFollowingAPath。
///
[RequireComponent(typeof(NavAgent))]
[RequireComponent(typeof(TransformBasedMovement))]
public class EnemyNavAgent : MonoBehaviour, IPathAgent
{
private NavAgent _navAgent;
private TransformBasedMovement _movement;
/// 正在沿路径移动时为 true。
public bool IsMoving => _navAgent != null && _navAgent.IsFollowingAPath;
public event System.Action OnNavPathFailed;
private void Awake()
{
_navAgent = GetComponent();
_movement = GetComponent();
}
public void RequestMoveTo(Vector2 target)
{
_navAgent?.UpdatePath(target);
}
public void StopNavigation()
{
_navAgent?.Stop();
}
public bool IsAtDestination()
{
if (_navAgent == null) return true;
// 已停止 OR 在目标线段上且不再跟随路径
return _navAgent.IsIdle;
}
public void SetSpeed(float speed)
{
if (_movement != null) _movement.movementSpeed = speed;
}
public bool IsNearEdge()
{
// 双射线检测:脚下前方是否有地面
if (_navAgent == null) return false;
var origin = (Vector2)transform.position;
var facing = transform.localScale.x >= 0f ? Vector2.right : Vector2.left;
var groundMask = ~0; // 检测所有层;可收窄至 Ground 层
bool groundAhead = Physics2D.Raycast(origin + facing * 0.3f, Vector2.down, 0.5f, groundMask);
return !groundAhead;
}
}
}