using System; using System.Collections; using System.Collections.Generic; using Common.Utility.CombatEvent; using Core.State; using Fort23.Core; using GameLogic.Combat.CombatTool; using GameLogic.Combat.Hero; using GameLogic.Combat.Hero.State; using GameLogic.Combat.Hero.SubStatus; using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical; using UnityEngine; using UnityEngine.AI; public class CombatAIBasic : IDisposable { public StateControl stateControl; public NavMeshAgent NavMeshAgent; private BetterList _subStatusList = new BetterList(); // public NavMeshObstacle NavMeshObstacle; protected CombatHeroEntity _combatHeroEntity; protected float _r = 5; /// /// 当前聚焦的目标 /// public CombatHeroEntity currFocusTarget; private BetterList _areaList = new BetterList(); private float _t; public void Init(CombatHeroEntity combatHeroEntity, NavMeshAgent navMeshAgent) { CombatEventManager.Instance.AddEventListener(CombatEventType.AlertTrigger, AlertTrigger); _combatHeroEntity = combatHeroEntity; stateControl = new StateControl(); NavMeshAgent = navMeshAgent; // WeChatWASM.File // NavMeshAgent.enabled = false; // NavMeshObstacle= navMeshAgent.gameObject.GetComponent(); // if (NavMeshObstacle == null) // { // NavMeshObstacle= navMeshAgent.gameObject.AddComponent(); // NavMeshObstacle.shape= NavMeshObstacleShape.Capsule; // NavMeshObstacle.radius = NavMeshAgent.radius-0.1f; // NavMeshObstacle.carving = true; // } ProInitState(); ProInit(); } public GameObject[] AreaList { get { return _areaList.ToArray(); } } protected virtual void ProInit() { } public void AddSubStatus(SubStatusBasic subStatusBasic) { if (!_subStatusList.Contains(subStatusBasic)) { subStatusBasic.Init(_combatHeroEntity); _subStatusList.Add(subStatusBasic); } } public T GetSubStatus() where T : SubStatusBasic { for (int i = 0; i < _subStatusList.Count; i++) { if (_subStatusList[i] is (T)) { return _subStatusList[i] as T; } } return null; } public void RemoveSubStatus(SubStatusBasic subStatusBasic) { if (_subStatusList.Contains(subStatusBasic)) { _subStatusList.Remove(subStatusBasic); } } 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); } } } 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)); 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)); } public void ChangeState(string name) { stateControl.ChangeState(name); } public void Update(float t) { for (int i = 0; i < _areaList.Count; i++) { if (!_areaList[i].activeSelf) { _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 (currFocusTarget == null || currFocusTarget.isDie || !_combatHeroEntity.IsAttDis(currFocusTarget.dotPos)) { CombatHeroEntity[] allHero = CombatController.currActiveCombat.CombatHeroController.GetHero(!_combatHeroEntity.IsEnemy); FindMinDixtance(allHero, out currFocusTarget); } stateControl.Update(t); if (currFocusTarget != null && !_combatHeroEntity.isDie) { if (!stateControl.CurrStateName.Equals(CombatHeroStateType.move) && !stateControl.CurrStateName.Equals(CombatHeroStateType.followMove) && !stateControl.CurrStateName.Equals(CombatHeroStateType.att)) { 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(); } protected virtual void ProUpdate() { } 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) { if (!_combatHeroEntity.IsEnemy || distance < _combatHeroEntity.CurrCombatHeroInfo.maxDis + 10) { minDistance = distance; minDistanceHero = hero; } } } } public void Dispose() { ProDispose(); _combatHeroEntity = null; stateControl.Dispose(); stateControl = null; } protected virtual void ProDispose() { CombatEventManager.Instance.RemoveEventListener(CombatEventType.AlertTrigger, AlertTrigger); } }