CombatAIBasic.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using Core.State;
  5. using GameLogic.Combat.CombatTool;
  6. using GameLogic.Combat.Hero;
  7. using GameLogic.Combat.Hero.State;
  8. using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical;
  9. using UnityEngine;
  10. using UnityEngine.AI;
  11. public class CombatAIBasic : IDisposable
  12. {
  13. public StateControl stateControl;
  14. public NavMeshAgent NavMeshAgent;
  15. protected CombatHeroEntity _combatHeroEntity;
  16. protected float _r = 5;
  17. /// <summary>
  18. /// 当前聚焦的目标
  19. /// </summary>
  20. public CombatHeroEntity currFocusTarget;
  21. public void Init(CombatHeroEntity combatHeroEntity, NavMeshAgent navMeshAgent)
  22. {
  23. _combatHeroEntity = combatHeroEntity;
  24. stateControl = new StateControl();
  25. NavMeshAgent = navMeshAgent;
  26. ProInitState();
  27. }
  28. protected void ProInitState()
  29. {
  30. stateControl.AddState(CombatHeroStateType.idle, new CombatHeroIdleState(_combatHeroEntity));
  31. stateControl.AddState(CombatHeroStateType.move, new CombatHeroMoveState(_combatHeroEntity));
  32. stateControl.AddState(CombatHeroStateType.att, new CombatHeroAttState(_combatHeroEntity));
  33. stateControl.AddState(CombatHeroStateType.dile, new CombatHeroDieState(_combatHeroEntity));
  34. }
  35. public void ChangeState(string name)
  36. {
  37. stateControl.ChangeState(name);
  38. }
  39. public void Update(float t)
  40. {
  41. CombatHeroEntity[] allHero =
  42. CombatController.currActiveCombat.CombatHeroController.GetHero(!_combatHeroEntity.IsEnemy);
  43. FindMinDixtance(allHero, out currFocusTarget);
  44. stateControl.Update(t);
  45. if (currFocusTarget != null)
  46. {
  47. if (!stateControl.CurrStateName.Equals(CombatHeroStateType.move))
  48. {
  49. Vector3 nextPos = currFocusTarget.dotPos;
  50. Vector3 p = nextPos - _combatHeroEntity.dotPos;
  51. if (p.sqrMagnitude > 0.00001)
  52. {
  53. _combatHeroEntity.combatHeroGameObject.rotation = Quaternion.Lerp(
  54. _combatHeroEntity.combatHeroGameObject.rotation, Quaternion.LookRotation(p.normalized), 0.5f);
  55. }
  56. }
  57. }
  58. }
  59. protected void FindMinDixtance(CombatHeroEntity[] allHero, out CombatHeroEntity minDistanceHero)
  60. {
  61. minDistanceHero = null;
  62. if (allHero == null)
  63. {
  64. return;
  65. }
  66. float minDistance = float.MaxValue;
  67. for (int i = 0; i < allHero.Length; i++)
  68. {
  69. CombatHeroEntity hero = allHero[i];
  70. float distance = Vector3.Distance(hero.combatHeroGameObject.position,
  71. _combatHeroEntity.combatHeroGameObject.position);
  72. if (distance < minDistance)
  73. {
  74. minDistance = distance;
  75. minDistanceHero = hero;
  76. }
  77. }
  78. }
  79. public void Dispose()
  80. {
  81. // NavMeshAgent.enabled = false;
  82. _combatHeroEntity = null;
  83. stateControl.Dispose();
  84. stateControl = null;
  85. }
  86. }