using Adon.Game.BO;
using AdonGameKit;
using System;
using System.Collections.Generic;
using UnityEngine;
namespace Adon.Game.Helper
{
///
/// 玩家帮助类
///
public static class PlayerHelperAdon
{
///
/// 攻击范围内获取最近怪物的距离
///
/// 攻击者
/// 搜索范围
///
///
public static float GetNearEnemyDistance(BaseHero attacker, float searchRange, out GameObject mob)
{
//Collider[] monsters = Physics.OverlapSphere(attacker.transform.position, searchRange, 1 << LayerMask.NameToLayer("Enemy"));
List monsters = RoleManager.Instance.GetLiveMonsters();
float num = -1f;
mob = null;
if (monsters.Count > 0)
{
for (int i = 0; i < monsters.Count; i++)
{
if (monsters[i] != null && monsters[i].isDie == false)
{
float distance = GetDistance(attacker.gameObject, monsters[i].gameObject);
if (distance <= searchRange)
{
if (num < 0f)
{
num = distance;
mob = monsters[i].gameObject;
}
else if (distance < num)
{
num = distance;
mob = monsters[i].gameObject;
}
}
}
}
}
return num;
}
///
/// 攻击范围内怪物列表
///
/// 攻击者
/// 搜索范围
///
///
public static List GetNearEnemysDistance(GameObject attacker, float searchRange)
{
List monsters = RoleManager.Instance.GetLiveMonsters();
float num = -1f;
List mobs = new List();
if (monsters.Count > 0)
{
for (int i = 0; i < monsters.Count; i++)
{
if (monsters[i] != null && monsters[i].mData.HP_Final > 0)
{
float distance = GetDistance(attacker.gameObject, monsters[i].gameObject);
if (distance <= searchRange)
{
if (num < 0f)
{
num = distance;
mobs.Add(monsters[i].gameObject);
}
else if (distance < num)
{
num = distance;
mobs.Add(monsters[i].gameObject);
}
}
}
}
}
return mobs;
}
public static List GetAllEnemysDistance(GameObject attacker, float searchRange)
{
List monsters = RoleManager.Instance.GetLiveMonsters();
List mobs = new List();
if (monsters.Count > 0)
{
for (int i = 0; i < monsters.Count; i++)
{
if (monsters[i] != null && monsters[i].mData.HP_Final > 0)
{
float distance = GetDistance(attacker.gameObject, monsters[i].gameObject);
if (distance <= searchRange)
{
mobs.Add(monsters[i].gameObject);
}
}
}
}
return mobs;
}
///
/// 获取范围内敌人
///
/// 搜寻范围
/// 检测角度
/// 英雄对象
///
public static List GetNearMonsters(float searchRange, float detectionAngle, GameObject hero)
{
List monsters = new List();
if (RoleManager.Instance.GetLiveMonsters().Count > 0)//存在的怪
{
for (int i = 0; i < RoleManager.Instance.GetLiveMonsters().Count; i++)//遍历列表
{
GameObject monsterObj = RoleManager.Instance.GetLiveMonsters()[i].gameObject;
float distance = GetDistance(hero, monsterObj);//怪物与英雄的距离
if (distance <= searchRange)//距离小于等于搜寻范围
{
Vector3 eyePos = hero.transform.position;
Vector3 toMonster = monsterObj.transform.position - eyePos;//向量
if (Vector3.Dot(toMonster.normalized, hero.transform.forward) > Mathf.Cos(detectionAngle * 0.5f * Mathf.Deg2Rad))
{
Debug.DrawRay(eyePos, toMonster, Color.blue);//绘制视线
monsters.Add(monsterObj);
}
}
}
}
return monsters;
}
///
/// 获取怪物周围的英雄
///
/// 搜寻范围
/// 怪物对象
///
public static List GetNearEnemyHero(float searchRange, float detectionAngle, GameObject mob)
{
List heros = new List();
if (RoleManager.Instance.GetPlayer() != null)
{
GameObject heroObj = RoleManager.Instance.GetPlayer().gameObject;
float distance = GetDistance(mob, heroObj);//怪物与英雄的距离
if (distance <= searchRange)//距离小于等于搜寻范围
{
Vector3 eyePos = mob.transform.position;
Vector3 toPlayer = heroObj.transform.position - eyePos;//向量
if (Vector3.Dot(toPlayer.normalized, mob.transform.forward) > Mathf.Cos(detectionAngle * 0.5f * Mathf.Deg2Rad))
{
Debug.DrawRay(eyePos, toPlayer, Color.blue);//绘制视线
heros.Add(heroObj);
}
}
}
if (heros.Count > 0)
{
return heros;
}
else
{
return null;
}
}
///
/// 获取敌人近身位置
///
/// 自身对象
/// 敌人对象
/// 范围
/// 角度
///
public static Vector3 GetEnemyNearPosition(GameObject src, GameObject enemy, float range, float angle)
{
Vector3 vector = enemy.transform.position - src.transform.position;//目标向量
vector.Normalize();
vector = vector * range;
return Quaternion.AngleAxis(angle, Vector3.up) * vector + enemy.transform.position;
}
///
/// 获取对象之间的距离
///
///
///
///
public static float GetDistance(GameObject src, GameObject target)
{
return Vector3.Distance(src.transform.position, target.transform.position);
}
//internal static float GetNearEnemyDistance(BaseCharacterAdon m_BaseCharacterAdon, float m_AutoAttackRange, out GameObject targetMonster)
//{
// throw new NotImplementedException();
//}
///
/// 计算夹角的角度 0~360
///
///
///
///
public static float Angle_360(Vector3 from_, Vector3 to_)
{
Vector3 v3 = Vector3.Cross(from_, to_);
if (v3.y > 0)
return Vector3.Angle(from_, to_);
else
return 360 - Vector3.Angle(from_, to_);
}
}
}