using BehaviorDesigner.Runtime.Tasks; using System.Collections.Generic; using UnityEngine; namespace CoreGame.Render { /// /// TODO /// public class HitAndRun : Action { [SerializeField] private float range; private CombatEntity m_OwnerEnt; private Vector2 m_TargetPos; private List m_TargetList; private float m_StartTime;//��Щʱ�򵽲���Ŀ��㣬����һ���ڵ����ִ��ʱ�� public override void OnStart() { m_StartTime = Time.time; m_OwnerEnt = Owner.GetEntity(); var ac = m_OwnerEnt.aI; var maxSqrDis = float.MaxValue; int targetEid = 0; for (var index = 0; index < ac.targetList.Count; index++) { var targetId = ac.targetList[index]; var target1 = Contexts.Combat.GetEntity(targetId); if (target1.IsValid() == false) { continue; } var sqrDis = (m_OwnerEnt.transformProxy.position - target1.transformProxy.position).sqrMagnitude; if (sqrDis < maxSqrDis) { maxSqrDis = sqrDis; targetEid = targetId; } } var target = Contexts.Combat.GetEntity(targetEid); Vector2 monsterPosition = m_OwnerEnt.transformProxy.position; Vector2 playerPosition = target.transformProxy.position; Vector2 monster2Player = (playerPosition - monsterPosition).normalized; float randomaRadius = RandomSrv.Range(0f, Mathf.PI * 2); Vector2 randomDir = new Vector2(Mathf.Cos(randomaRadius), Mathf.Sin(randomaRadius)); Vector2 fleeDir = (randomDir - monster2Player).normalized; m_TargetPos = monsterPosition + fleeDir * range; } public override TaskStatus OnUpdate() { var speed = m_OwnerEnt.property.MoveSpeed; m_OwnerEnt.navAgentProxy.SetDestination(m_TargetPos, speed); if ((m_OwnerEnt.transformProxy.position - m_TargetPos).sqrMagnitude < 0.1f) { return TaskStatus.Success; } if (m_StartTime + 1.5f < Time.time) { m_OwnerEnt.navAgentProxy.StopNav(); return TaskStatus.Failure; } return TaskStatus.Running; } } }