Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / role / enemy / state / AiLeaveForState.cs
  1.  
  2. using Godot;
  3.  
  4. /// <summary>
  5. /// 前往目标位置
  6. /// </summary>
  7. public class AiLeaveForState : StateBase<Enemy, AiStateEnum>
  8. {
  9. private Vector2 _targetPosition;
  10.  
  11. public AiLeaveForState() : base(AiStateEnum.AiLeaveFor)
  12. {
  13. }
  14.  
  15. public override void Enter(AiStateEnum prev, params object[] args)
  16. {
  17. if (args.Length > 0 && args[0] is Vector2 pos)
  18. {
  19. UpdateTargetPosition(pos);
  20. }
  21. else
  22. {
  23. ChangeState(AiStateEnum.AiNormal);
  24. }
  25. }
  26.  
  27. public override void PhysicsProcess(float delta)
  28. {
  29. //计算移动
  30. var nextPos = Master.NavigationAgent2D.GetNextLocation();
  31. Master.LookTargetPosition(_targetPosition);
  32. Master.AnimatedSprite.Animation = AnimatorNames.Run;
  33. Master.Velocity = (nextPos - Master.GlobalPosition - Master.NavigationPoint.Position).Normalized() *
  34. Master.MoveSpeed;
  35. Master.CalcMove(delta);
  36.  
  37. var playerPos = GameApplication.Instance.Room.Player.GetCenterPosition();
  38. //检测玩家是否在视野内, 如果在, 则切换到 AiTargetInView 状态
  39. if (Master.IsInTailAfterViewRange(playerPos))
  40. {
  41. if (!Master.TestViewRayCast(playerPos)) //看到玩家
  42. {
  43. //关闭射线检测
  44. Master.TestViewRayCastOver();
  45. //切换成发现目标状态
  46. ChangeStateLate(AiStateEnum.AiTargetInView);
  47. //派发发现玩家事件
  48. EventManager.EmitEvent(EventEnum.OnEnemyFindPlayer);
  49. return;
  50. }
  51. else
  52. {
  53. //关闭射线检测
  54. Master.TestViewRayCastOver();
  55. }
  56. }
  57.  
  58. //移动到目标掉了, 还没发现目标
  59. if (Master.NavigationAgent2D.IsNavigationFinished())
  60. {
  61. ChangeStateLate(AiStateEnum.AiNormal);
  62. }
  63. }
  64.  
  65. public void UpdateTargetPosition(Vector2 pos)
  66. {
  67. _targetPosition = pos;
  68. Master.NavigationAgent2D.SetTargetLocation(pos);
  69. }
  70. }