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