using Common.Utility.CombatEvent; using Core.State; using Fort23.Core; using GameLogic.Combat.CombatState; using GameLogic.Combat.CombatTool; using GameLogic.Combat.Hero.State; using GameLogic.Combat.Hero.SubStatus; using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical; using UnityEngine; namespace GameLogic.Combat.Hero { public class CombatHeroAi : CombatAIBasic { // public NavMeshObstacle NavMeshObstacle; protected CombatHeroEntity _combatHeroEntity { get { return _showBaiscEntity as CombatHeroEntity; } } protected float _r = 5; public bool isAlert; /// /// 当前聚焦的目标 /// public override IHero currFocusTarget { get { return _currFocusTarget; } set { CombatHeroTargetAlterEventData combatHeroTargetAlterEventData = CombatHeroTargetAlterEventData.Create(); combatHeroTargetAlterEventData.combatHeroEntity = _combatHeroEntity; combatHeroTargetAlterEventData.targetCombatHeroEntity = value; combatHeroTargetAlterEventData.lasetCombatHeroEntity = _currFocusTarget; CombatEventManager.Instance.Dispatch(CombatEventType.TargetAlter, combatHeroTargetAlterEventData); _currFocusTarget = value; } } private BetterList _areaList = new BetterList(); private BetterList _HindAreaList = new BetterList(); private float _t; public GameObject[] AreaList { get { return _areaList.ToArray(); } } protected override void ProInit() { CombatEventManager.Instance.AddEventListener(CombatEventType.AlertTrigger, AlertTrigger); } protected void AlertTrigger(IEventData iEventData) { AlertTriggerEventData alertTriggerEventData = iEventData as AlertTriggerEventData; if (alertTriggerEventData.combatHeroEntity == _combatHeroEntity) { if (alertTriggerEventData.isTrigger && !_areaList.Contains(alertTriggerEventData.triggerObject)) { _areaList.Add(alertTriggerEventData.triggerObject); } else if (!alertTriggerEventData.isTrigger) { _areaList.Remove(alertTriggerEventData.triggerObject); _HindAreaList.Remove(alertTriggerEventData.triggerObject); } } } protected override 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)); stateControl.AddState(CombatHeroStateType.rolling, new CombatHeroRollingState(_combatHeroEntity)); stateControl.AddState(CombatHeroStateType.followMove, new CombatHeroFollowMoveState(_combatHeroEntity)); stateControl.AddState(CombatHeroStateType.followIdle, new CombatHeroFollowIdleState(_combatHeroEntity)); stateControl.AddState(CombatHeroStateType.NullState, new CombatHeroNullState(_combatHeroEntity)); stateControl.AddState(CombatHeroStateType.Active, new CombatHeroActiveState(_combatHeroEntity)); stateControl.AddState(CombatHeroStateType.XiuMian, new CombatHeroXiuMianState(_combatHeroEntity)); stateControl.AddState(CombatHeroStateType.Resurrection, new CombatResurrectionState(_combatHeroEntity)); stateControl.AddState(CombatHeroStateType.PickUp, new CombatHeroPickUpState(_combatHeroEntity)); stateControl.AddState(CombatHeroStateType.Flight, new CombatHeroFlightState(_combatHeroEntity)); stateControl.AddState(CombatHeroStateType.Disappear, new CombatHeroDisappearState(_combatHeroEntity)); } public override void Update(float t) { if (CombatController.currActiveCombat.isStopAi) { if (stateControl.CurrStateName.Equals(CombatHeroStateType.move)) { stateControl.ChangeState(CombatHeroStateType.idle); } return; } for (int i = 0; i < _areaList.Count; i++) { if (!_areaList[i].activeSelf) { _HindAreaList.Remove(_areaList[i]); _areaList.RemoveAt(i); i--; } } for (int i = 0; i < _subStatusList.Count; i++) { SubStatusBasic subStatusBasic = _subStatusList[i]; string s = subStatusBasic.IsGetStateName(); if (!string.IsNullOrEmpty(s)) { stateControl.ChangeState(s); } _subStatusList[i].Update(t); } if (CombatController.currActiveCombat.IsFightState) { if (currFocusTarget == null || currFocusTarget.isDie || (currFocusTarget is BannerHero && !_combatHeroEntity.IsEnemy)) { CombatHeroEntity[] allHero = CombatController.currActiveCombat.CombatHeroController.GetHero(!_combatHeroEntity.IsEnemy); IHero minDistanceHero = FindMinDixtance(allHero); currFocusTarget = minDistanceHero; if (!_combatHeroEntity.IsEnemy && currFocusTarget == null) { currFocusTarget = CombatController.currActiveCombat.CombatTypeBasic.currBannerHero; } } } else { currFocusTarget = null; } stateControl.Update(t); if (currFocusTarget != null && CurrState != null && CurrState.IsUpdateLockTarget() && !_combatHeroEntity.isDie && !isAlert) { 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); } } ProUpdate(); if (currFocusTarget != null) { _combatHeroEntity.GameObject.transform.rotation = Quaternion.LookRotation(currFocusTarget.dotPos - _combatHeroEntity.dotPos); } } protected IHero FindMinDixtance(CombatHeroEntity[] allHero) { IHero minDistanceHero = null; if (allHero == null) { return null; } float minDistance = float.MaxValue; for (int i = 0; i < allHero.Length; i++) { CombatHeroEntity hero = allHero[i]; if (hero.GetMainHotPoin() == null) { continue; } float distance = Vector3.SqrMagnitude(hero.combatHeroGameObject.position - _combatHeroEntity.combatHeroGameObject.position); if (distance < minDistance) { // if (!_combatHeroEntity.IsEnemy || distance < _combatHeroEntity.CurrCombatHeroInfo.maxDisTo + 100) { minDistance = distance; minDistanceHero = hero; } } } return minDistanceHero; } protected override void ProDispose() { CombatEventManager.Instance.RemoveEventListener(CombatEventType.AlertTrigger, AlertTrigger); } } }