using System.Collections.Generic; using BehaviorDesigner.Runtime.Tasks; using UnityEngine; namespace CoreGame.Render { public class ChaseAction : Action { [SerializeField] private float distance; [SerializeField] private float waitTime; [BehaviorDesigner.Runtime.Tasks.Tooltip("如果为true,追逐范围则为手中的武器攻击范围减去distance")] [SerializeField] private bool useWeaponRangeDistance; private float m_StartTime; private List m_TargetList; private CombatEntity m_OwnerEnt; private int m_TargetId; private Vector2 m_TargetPos; public override void OnStart() { m_StartTime = Time.time; m_OwnerEnt = Owner.GetEntity(); var ac = m_OwnerEnt.aI; var maxSqrDis = float.MaxValue; m_TargetId = 0; for (var index = 0; index < ac.targetList.Count; index++) { var target1 = Contexts.Combat.GetEntity(ac.targetList[index]); if (target1.IsValid() == false) { continue; } var sqrDis = (m_OwnerEnt.transformProxy.position - target1.transformProxy.position).sqrMagnitude; if (sqrDis < maxSqrDis) { maxSqrDis = sqrDis; m_TargetId = target1.creationIndex; } } // var target = Contexts.Combat.GetEntity(m_TargetId); // var tc = target.transformProxy; // float monsterSpeed = m_OwnerEnt.property.MoveSpeed; // // float playerSpeed = tc.renderSpeed; //���ڵ��õ���ʱ��ұ������������Ҫ�ij�ʵʱ��; //if (playerSpeed * 1.05f < monsterSpeed) //速度足够大才会追击 防止速度相近时预测距离过大 //{ // Vector2 monsterPosition = m_OwnerEnt.transformProxy.position; // Vector2 playerPosition = target.transformProxy.position; // Vector2 playerMoveDirection = target.transformProxy.direction; // Vector2 monster2Player = (playerPosition - monsterPosition).normalized; // float alphaAngle = Vector2.Angle(playerMoveDirection, monster2Player); // float cosAlpha = Mathf.Cos(alphaAngle * Mathf.Deg2Rad); // float sinBeta = Mathf.Min(Mathf.Sin(alphaAngle * Mathf.Deg2Rad) * playerSpeed / monsterSpeed, 1f);//��ֹ�����ٶ�С�������ٶ�ʱ���쳣ֵ���� // float cosBeta = Mathf.Sqrt(1 - sinBeta * sinBeta); //������ // float temp = monsterSpeed * cosBeta - playerSpeed * cosAlpha; // float cutDis = Mathf.Sqrt((target.transformProxy.position - m_OwnerEnt.transformProxy.position).sqrMagnitude); // float predictTime = cutDis / temp; // if (predictTime < 100) //每秒缩短的距离小于1%当前距离时直接追放弃预判 // { // Vector2 posPredict = playerMoveDirection * playerSpeed * predictTime; // if (cutDis <= 3f) // { // posPredict = new Vector2(0, 0); // } // Vector2 posRandomOffset = monster2Player * (-1) * 0.5f; // Vector2 posRandom = Random.insideUnitCircle * 0.2f; // m_TargetPos = posPredict + posRandomOffset + posRandom + target.transformProxy.position; // } // else // { // m_TargetPos = target.transformProxy.position; // } // //Debug.Log(Contexts.Combat.input.dir); //} //else { // m_TargetPos = target.transformProxy.position; //} //m_TargetPos = target.transformProxy.position; } public override TaskStatus OnUpdate() { var target = Contexts.Combat.GetEntity(m_TargetId); if (target == null || target.IsValid == false) return TaskStatus.Failure; //var speed = m_OwnerEnt.property.MoveSpeed; //m_OwnerEnt.ReplaceNav(target.transformProxy.position, speed); //Debug.Log((target.transformProxy.position - m_OwnerEnt.transformProxy.position).sqrMagnitude); //Debug.Log(Mathf.Sqrt(this.distance)); //if ((target.transformProxy.position - m_OwnerEnt.transformProxy.position).sqrMagnitude < // Mathf.Sqrt(this.distance) || m_StartTime + waitTime < Time.time) //{ // m_OwnerEnt.RemoveNav(); // return TaskStatus.Success; //} //return TaskStatus.Running; m_TargetPos = target.transformProxy.position; //if ((target.transformProxy.position - m_OwnerEnt.transformProxy.position).sqrMagnitude < (4.0f)) //{ // m_TargetPos = target.transformProxy.position; //} var tempDis = distance; if (useWeaponRangeDistance && m_OwnerEnt.hasEquips) { var equipData = m_OwnerEnt.equips.GetHoldSlotData(); var tbGun = WeaponDescMgr.Instance.GetConfig(equipData.gunCfgId); if (tbGun != null) { var orDefault = TalentDescMgr.Instance.GetConfig(tbGun.FireSkill); if (orDefault != null) { var skillDesc = SkillDescMgr.Instance.GetConfig(orDefault.skillId[0]); if (skillDesc != null) { var tbGaCastCondition = GACastConditionDescMgr.Instance.GetConfig(skillDesc.GACastConditionID); // tempDis = tbGaCastCondition.skillConditionDistance * BattleConst.TenThousandReverse - // distance; } } } } if ((m_TargetPos - m_OwnerEnt.transformProxy.position).sqrMagnitude < tempDis * tempDis) { m_OwnerEnt.navAgentProxy.StopNav(); return TaskStatus.Success; } //if (m_StartTime + waitTime < Time.time) //{ // m_OwnerEnt.navAgentProxy.StopNav(); // return TaskStatus.Failure; //} var speed = m_OwnerEnt.property.MoveSpeed; m_OwnerEnt.navAgentProxy.SetDestination(m_TargetPos, speed); return TaskStatus.Running; } } }