using System; using System.Collections; using System.Collections.Generic; using Core.State; using GameLogic.Combat.CombatTool; using GameLogic.Combat.Hero; using GameLogic.Combat.Hero.State; using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical; using UnityEngine; using UnityEngine.AI; public class CombatAIBasic : IDisposable { public StateControl stateControl; public NavMeshAgent NavMeshAgent; protected CombatHeroEntity _combatHeroEntity; protected float _r = 5; /// /// 当前聚焦的目标 /// public CombatHeroEntity currFocusTarget; public void Init(CombatHeroEntity combatHeroEntity, NavMeshAgent navMeshAgent) { _combatHeroEntity = combatHeroEntity; stateControl = new StateControl(); NavMeshAgent = navMeshAgent; ProInitState(); } protected void ProInitState() { stateControl.AddState(CombatHeroStateType.idle, new CombatHeroIdleState(_combatHeroEntity)); stateControl.AddState(CombatHeroStateType.move, new CombatHeroMoveState(_combatHeroEntity)); stateControl.AddState(CombatHeroStateType.att, new CombatHeroAttState(_combatHeroEntity)); stateControl.AddState(CombatHeroStateType.dile, new CombatHeroDieState(_combatHeroEntity)); } public void ChangeState(string name) { stateControl.ChangeState(name); } public void Update(float t) { CombatHeroEntity[] allHero = CombatController.currActiveCombat.CombatHeroController.GetHero(!_combatHeroEntity.IsEnemy); FindMinDixtance(allHero, out currFocusTarget); stateControl.Update(t); if (currFocusTarget != null) { if (!stateControl.CurrStateName.Equals(CombatHeroStateType.move)) { Vector3 nextPos = currFocusTarget.dotPos; Vector3 p = nextPos - _combatHeroEntity.dotPos; if (p.sqrMagnitude > 0.00001) { _combatHeroEntity.combatHeroGameObject.rotation = Quaternion.Lerp( _combatHeroEntity.combatHeroGameObject.rotation, Quaternion.LookRotation(p.normalized), 0.5f); } } } } protected void FindMinDixtance(CombatHeroEntity[] allHero, out CombatHeroEntity minDistanceHero) { minDistanceHero = null; if (allHero == null) { return; } float minDistance = float.MaxValue; for (int i = 0; i < allHero.Length; i++) { CombatHeroEntity hero = allHero[i]; float distance = Vector3.Distance(hero.combatHeroGameObject.position, _combatHeroEntity.combatHeroGameObject.position); if (distance < minDistance) { minDistance = distance; minDistanceHero = hero; } } } public void Dispose() { // NavMeshAgent.enabled = false; _combatHeroEntity = null; stateControl.Dispose(); stateControl = null; } }