public bool SignalReaches(Minion receiver) { Vector2 planetDirection = (Vector2)Planet.position - (Vector2)transform.position; if (Vector2.Dot(planetDirection, (Vector2)Planet.position - (Vector2)receiver.transform.position) < 0) { return(false); } Vector2 receiverDirection = (Vector2)receiver.transform.position - (Vector2)transform.position; float planetAngle = Mathf.Atan2(planetDirection.y, planetDirection.x) * MathUtils.RADIUS2DEGREE; float receiverAngle = Mathf.Atan2(receiverDirection.y, receiverDirection.x) * MathUtils.RADIUS2DEGREE; if (Mathf.Abs(MathUtils.AngleDifference(planetAngle, receiverAngle)) > broadcastRadius) { return(false); } Vector2 rayStart = transform.position; Vector2 rayEnd = (Vector2)(receiver.transform.position - Planet.position).normalized * (Planet.GetComponentInChildren <CircleCollider2D>().radius + 0.01f); Vector2 direction = (rayEnd - rayStart); float distance = direction.magnitude; direction.Normalize(); var hits = Physics2D.RaycastAll(transform.position, direction, distance); if (hits.Any(hit => hit.transform != transform && hit.transform != receiver.transform)) { return(false); } line.positionCount += 2; line.SetPosition(line.positionCount - 2, transform.position + new Vector3(0, 0, 0.5f)); line.SetPosition(line.positionCount - 1, receiver.transform.position); return(true); }