/// <summary> /// Returns the closest enemy of given UnitTypes that is within the given maximum distance. /// </summary> /// <param name="myUnit">Unit to find the enemies of.</param> /// <param name="unitTypes">Array of unit types that are valid targets.</param> /// <param name="maxDistance">Maximum distance to find enemies.</param> /// <returns>Closest enemy unit within max distance.</returns> public static GameObject GetClosestEnemy(GameObject myUnit, UnitType[] unitTypes, int maxDistance, bool objectiveUnitsOnly) { List <GameObject> enemies; if (objectiveUnitsOnly) { enemies = UnitTracker.GetObjectiveEnemies(myUnit); } else { enemies = UnitTracker.GetActiveEnemies(myUnit); } GameObject closestEnemy = null; float closestEnemyDistance = float.MaxValue; foreach (GameObject go in enemies) { bool isCorrectShipType = false; foreach (UnitType ut in unitTypes) { if (go.GetComponent <UnitInfo>().UnitType == ut) { isCorrectShipType = true; break; } } if (!isCorrectShipType) { continue; } float dist = (go.transform.position - myUnit.transform.position).magnitude; if (dist < closestEnemyDistance && dist <= maxDistance) { closestEnemyDistance = (go.transform.position - myUnit.transform.position).magnitude; closestEnemy = go; } } return(closestEnemy); }