using UnityEngine; namespace Saltosion.OneWeapon.Utils { public class Util { public static T GetClosestTo(Transform Searcher, float radius, LayerMask layerMask, bool needsLineOfSight = false) where T : MonoBehaviour { Collider2D[] NearbyColliders = Physics2D.OverlapCircleAll(Searcher.position, radius); float LowestDistance = float.PositiveInfinity; T FoundTarget = null; foreach (Collider2D Collider in NearbyColliders) { if (Collider.gameObject == Searcher.gameObject) { continue; } Vector2 Delta = (Collider.transform.position - Searcher.position); float Distance = Delta.magnitude; T TargetComponent = Collider.GetComponent(); RaycastHit2D[] Hits = Physics2D.RaycastAll(Searcher.position, Delta.normalized, Distance, layerMask); bool LineOfSightObstructed; if (needsLineOfSight) { LineOfSightObstructed = false; foreach (RaycastHit2D Hit in Hits) { if (Hit.collider != Collider && Hit.transform != Searcher && (Hit.rigidbody == null || Hit.rigidbody.transform != Searcher)) { // Hit something between the target and the searcher LineOfSightObstructed = true; break; } } } else { LineOfSightObstructed = false; } if (TargetComponent != null && !LineOfSightObstructed && Distance < LowestDistance) { LowestDistance = Distance; FoundTarget = TargetComponent; } } return FoundTarget; } public static int RandomValueBetween(int min, int max) { int RollMax = max - min; return (int)(min + Mathf.Min(Mathf.Floor(Random.value * (RollMax + 1)), RollMax)); } } }