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_); } } }