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 OfficeOpenXml.FormulaParsing.Excel.Functions.Logical;
using UnityEngine;
using UnityEngine.AI;
public class CombatAIBasic : IDisposable
{
public StateControl stateControl;
public NavMeshAgent NavMeshAgent;
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()
{
}
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));
}
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--;
}
}
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))
{
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);
}
}