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
164 lines
6.7 KiB
using System.Collections.Generic;
|
|
using BehaviorDesigner.Runtime.Tasks;
|
|
using UnityEngine;
|
|
|
|
namespace CoreGame.Render
|
|
{
|
|
public class FakeChaseAction : 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.Success;
|
|
}
|
|
|
|
var speed = m_OwnerEnt.property.MoveSpeed;
|
|
m_OwnerEnt.navAgentProxy.SetDestination(m_TargetPos, speed);
|
|
return TaskStatus.Running;
|
|
}
|
|
}
|
|
}
|