| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 | 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;        /// <summary>        /// 当前聚焦的目标        /// </summary>        public override CombatHeroEntity currFocusTarget        {            get { return _currFocusTarget; }            set            {                if (value == _currFocusTarget)                {                    return;                }                CombatHeroTargetAlterEventData combatHeroTargetAlterEventData = CombatHeroTargetAlterEventData.Create();                combatHeroTargetAlterEventData.combatHeroEntity = _combatHeroEntity;                combatHeroTargetAlterEventData.targetCombatHeroEntity = value;                combatHeroTargetAlterEventData.lasetCombatHeroEntity = _currFocusTarget;                CombatEventManager.Instance.Dispatch(CombatEventType.TargetAlter, combatHeroTargetAlterEventData);                _currFocusTarget = value;            }        }        private BetterList<GameObject> _areaList = new BetterList<GameObject>();        private BetterList<GameObject> _HindAreaList = new BetterList<GameObject>();        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, out int maxCount);                    IHero minDistanceHero = FindMinDixtance(allHero,maxCount);                    currFocusTarget = minDistanceHero as CombatHeroEntity;                    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,int maxCount)        {            IHero minDistanceHero = null;            if (allHero == null)            {                return null;            }            float minDistance = float.MaxValue;            for (int i = 0; i < maxCount; i++)            {                CombatHeroEntity hero = allHero[i];                if (hero.GetMainHotPoin<CombatHeroHitPoint>() == 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);        }    }}
 |