using Godot; using NnormalState; /// <summary> /// 基础敌人 /// </summary> [Tool] public partial class Enemy : Role { /// <summary> /// 目标是否在视野内 /// </summary> public bool TargetInView { get; set; } = true; /// <summary> /// 敌人身上的状态机控制器 /// </summary> public StateController<Enemy, AiStateEnum> StateController { get; private set; } /// <summary> /// 视野半径, 单位像素, 发现玩家后改视野范围可以穿墙 /// </summary> public float ViewRange { get; set; } = 250; /// <summary> /// 发现玩家后的视野半径 /// </summary> public float TailAfterViewRange { get; set; } = 400; /// <summary> /// 背后的视野半径, 单位像素 /// </summary> public float BackViewRange { get; set; } = 50; /// <summary> /// 视野检测射线, 朝玩家打射线, 检测是否碰到墙 /// </summary> [Export, ExportFillNode] public RayCast2D ViewRay { get; private set; } /// <summary> /// 导航代理 /// </summary> [Export, ExportFillNode] public NavigationAgent2D NavigationAgent2D { get; private set; } /// <summary> /// 导航代理中点 /// </summary> [Export, ExportFillNode] public Marker2D NavigationPoint { get; private set; } //锁定目标时间 private float _lockTargetTime = 0; public override void OnInit() { base.OnInit(); IsAi = true; StateController = AddComponent<StateController<Enemy, AiStateEnum>>(); AttackLayer = PhysicsLayer.Wall | PhysicsLayer.Player; EnemyLayer = PhysicsLayer.Player; Camp = CampEnum.Camp2; RoleState.MoveSpeed = 20; MaxHp = 20; Hp = 20; StateController.Register(new AiNormalState()); StateController.ChangeState(AiStateEnum.AiNormal); } public override void EnterTree() { if (!World.Enemy_InstanceList.Contains(this)) { World.Enemy_InstanceList.Add(this); } } public override void ExitTree() { World.Enemy_InstanceList.Remove(this); } }