You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

164 lines
6.7 KiB

1 month ago
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<CombatEntity> 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<CombatEntity>();
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;
}
}
}