public static Vector3 ConvertToDistanceDirectionVector3(Vector3 value, DistanceDirection distanceDirection)
        {
            switch (distanceDirection)
            {
            case DistanceDirection.HORIZONTAL:
                return(new Vector3(value.x, 0f, value.z));

            case DistanceDirection.VERTICAL:
                return(new Vector3(0, value.y, 0));
            }

            return(value);
        }
        public static bool IsWithinDistance(Vector3 origin, Vector3 position, float sqrViewMagnitude, DistanceDirection distanceDirection)
        {
            origin   = ConvertToDistanceDirectionVector3(origin, distanceDirection);
            position = ConvertToDistanceDirectionVector3(position, distanceDirection);

            // return Vector3.SqrMagnitude(position - origin) < sqrViewMagnitude;
            return(Vector3.Distance(position, origin) <= sqrViewMagnitude);
        }
 public static bool IsWithinDistance(Collider sourceCollider, Vector3 position, float sqrViewMagnitude, DistanceDirection distanceDirection)
 {
     return(IsWithinDistance(sourceCollider.ClosestPointOnBounds(position), position, sqrViewMagnitude, distanceDirection));
 }
 public static bool IsWithinDistance(Transform sourceTransform, Vector3 position, float sqrViewMagnitude, DistanceDirection distanceDirection)
 {
     return(IsWithinDistance(sourceTransform.position, position, sqrViewMagnitude, distanceDirection));
 }
        public static bool IsWithinViewingAngle(Transform sourceTransform, Transform targetTransform, float fieldOfViewAngle, DistanceDirection distanceDirection = DistanceDirection.ALL)
        {
            Vector3 origin = ConvertToDistanceDirectionVector3(sourceTransform.position, distanceDirection);
            Vector3 target = ConvertToDistanceDirectionVector3(targetTransform.position, distanceDirection);


            Vector3 direction = target - origin;
            float   angle     = Vector3.Angle(GetDirection(origin, target), sourceTransform.forward);

            return(angle < fieldOfViewAngle);
        }
        // returns true if targetTransform is within sight of transform
        public static bool IsWithinSight(Transform sourceTransform, Transform targetTransform, float fieldOfViewAngle, float sqrViewMagnitude, DistanceDirection distanceDirection = DistanceDirection.ALL)
        {
            Vector3 direction = targetTransform.position - sourceTransform.position;
            float   angle     = Vector3.Angle(direction, sourceTransform.forward);

            // an object is within sight if it is within the field of view and has a magnitude less than what the object can see
            if (IsWithinViewingAngle(sourceTransform, targetTransform, fieldOfViewAngle, distanceDirection) &&
                IsWithinDistance(sourceTransform, targetTransform, sqrViewMagnitude, distanceDirection))
            {
                return(true);

                // return IsInLineOfSight(sourceTransform, targetTransform, GetDirection(sourceTransform, targetTransform));
            }

            return(false);
        }