CombatAIBasic.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using Common.Utility.CombatEvent;
  5. using Core.State;
  6. using Fort23.Core;
  7. using GameLogic.Combat.CombatTool;
  8. using GameLogic.Combat.Hero;
  9. using GameLogic.Combat.Hero.State;
  10. using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical;
  11. using UnityEngine;
  12. using UnityEngine.AI;
  13. public class CombatAIBasic : IDisposable
  14. {
  15. public StateControl stateControl;
  16. public NavMeshAgent NavMeshAgent;
  17. protected CombatHeroEntity _combatHeroEntity;
  18. protected float _r = 5;
  19. /// <summary>
  20. /// 当前聚焦的目标
  21. /// </summary>
  22. public CombatHeroEntity currFocusTarget;
  23. private BetterList<GameObject> _areaList = new BetterList<GameObject>();
  24. public void Init(CombatHeroEntity combatHeroEntity, NavMeshAgent navMeshAgent)
  25. {
  26. CombatEventManager.Instance.AddEventListener(CombatEventType.AlertTrigger, AlertTrigger);
  27. _combatHeroEntity = combatHeroEntity;
  28. stateControl = new StateControl();
  29. NavMeshAgent = navMeshAgent;
  30. ProInitState();
  31. ProInit();
  32. }
  33. protected virtual void ProInit()
  34. {
  35. }
  36. protected void AlertTrigger(IEventData iEventData)
  37. {
  38. AlertTriggerEventData alertTriggerEventData = iEventData as AlertTriggerEventData;
  39. if (alertTriggerEventData.combatHeroEntity == _combatHeroEntity)
  40. {
  41. if (alertTriggerEventData.isTrigger && _areaList.Contains(alertTriggerEventData.triggerObject))
  42. {
  43. _areaList.Add(alertTriggerEventData.triggerObject);
  44. }
  45. else if (!alertTriggerEventData.isTrigger)
  46. {
  47. _areaList.Remove(alertTriggerEventData.triggerObject);
  48. }
  49. }
  50. }
  51. protected void ProInitState()
  52. {
  53. stateControl.AddState(CombatHeroStateType.idle, new CombatHeroIdleState(_combatHeroEntity));
  54. stateControl.AddState(CombatHeroStateType.move, new CombatHeroMoveState(_combatHeroEntity));
  55. stateControl.AddState(CombatHeroStateType.att, new CombatHeroAttState(_combatHeroEntity));
  56. stateControl.AddState(CombatHeroStateType.dile, new CombatHeroDieState(_combatHeroEntity));
  57. stateControl.AddState(CombatHeroStateType.rolling, new CombatHeroRollingState(_combatHeroEntity));
  58. }
  59. public void ChangeState(string name)
  60. {
  61. stateControl.ChangeState(name);
  62. }
  63. public void Update(float t)
  64. {
  65. CombatHeroEntity[] allHero =
  66. CombatController.currActiveCombat.CombatHeroController.GetHero(!_combatHeroEntity.IsEnemy);
  67. FindMinDixtance(allHero, out currFocusTarget);
  68. stateControl.Update(t);
  69. if (currFocusTarget != null)
  70. {
  71. if (!stateControl.CurrStateName.Equals(CombatHeroStateType.move))
  72. {
  73. Vector3 nextPos = currFocusTarget.dotPos;
  74. Vector3 p = nextPos - _combatHeroEntity.dotPos;
  75. if (p.sqrMagnitude > 0.00001)
  76. {
  77. _combatHeroEntity.combatHeroGameObject.rotation = Quaternion.Lerp(
  78. _combatHeroEntity.combatHeroGameObject.rotation, Quaternion.LookRotation(p.normalized), 0.5f);
  79. }
  80. }
  81. }
  82. ProUpdate();
  83. }
  84. protected virtual void ProUpdate()
  85. {
  86. }
  87. protected void FindMinDixtance(CombatHeroEntity[] allHero, out CombatHeroEntity minDistanceHero)
  88. {
  89. minDistanceHero = null;
  90. if (allHero == null)
  91. {
  92. return;
  93. }
  94. float minDistance = float.MaxValue;
  95. for (int i = 0; i < allHero.Length; i++)
  96. {
  97. CombatHeroEntity hero = allHero[i];
  98. float distance = Vector3.Distance(hero.combatHeroGameObject.position,
  99. _combatHeroEntity.combatHeroGameObject.position);
  100. if (distance < minDistance)
  101. {
  102. if (!_combatHeroEntity.IsEnemy || distance < _combatHeroEntity.CurrCombatHeroInfo.maxDis + 3)
  103. {
  104. minDistance = distance;
  105. minDistanceHero = hero;
  106. }
  107. }
  108. }
  109. }
  110. public void Dispose()
  111. {
  112. ProDispose();
  113. _combatHeroEntity = null;
  114. stateControl.Dispose();
  115. stateControl = null;
  116. }
  117. protected virtual void ProDispose()
  118. {
  119. CombatEventManager.Instance.RemoveEventListener(CombatEventType.AlertTrigger, AlertTrigger);
  120. }
  121. }