Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / activity / role / ai / state / AiAstonishedState.cs
  1. using Godot;
  2.  
  3. namespace AiState;
  4.  
  5. /// <summary>
  6. /// 发现目标时的惊讶状态
  7. /// </summary>
  8. public class AiAstonishedState : StateBase<AiRole, AIStateEnum>
  9. {
  10. /// <summary>
  11. /// 用于判断是否进入过惊讶状态
  12. /// </summary>
  13. public bool IsEntred = false;
  14. private float _timer;
  15. private object[] _args;
  16. public AiAstonishedState() : base(AIStateEnum.AiAstonished)
  17. {
  18. }
  19.  
  20. public override void Enter(AIStateEnum prev, params object[] args)
  21. {
  22. if (args.Length == 0)
  23. {
  24. Debug.Log("进入 AINormalStateEnum.AiAstonished 状态必传入下一个状态做完参数!");
  25. ChangeState(prev);
  26. return;
  27. }
  28.  
  29. if (IsEntred || !Master.AnimationPlayer.HasAnimation(AnimatorNames.Astonished))
  30. {
  31. ChangeNextState(args);
  32. return;
  33. }
  34.  
  35. IsEntred = true;
  36. _args = args;
  37.  
  38. _timer = 0.6f;
  39.  
  40. //播放惊讶表情
  41. Master.AnimationPlayer.Play(AnimatorNames.Astonished);
  42. }
  43.  
  44. public override void Process(float delta)
  45. {
  46. Master.DoIdle();
  47. _timer -= delta;
  48. if (_timer <= 0)
  49. {
  50. ChangeNextState(_args);
  51. }
  52. }
  53.  
  54. private void ChangeNextState(object[] args)
  55. {
  56. if (args.Length == 1)
  57. {
  58. ChangeState((AIStateEnum)args[0]);
  59. }
  60. else if (args.Length == 2)
  61. {
  62. ChangeState((AIStateEnum)args[0], args[1]);
  63. }
  64. }
  65. }