public static bool CanSeeTarget(this Movable seer, Movable target, float maxDistance) { RayCastHitInfo hitInfo = GenPhysics.RayCastObject(seer, seer.GlobalPosition, target.GlobalPosition, out bool hitSomething); if (!hitSomething || hitInfo.collider == null) { return(false); } Node hitNode = hitInfo.collider as Node; return(hitNode == target && seer.GlobalPosition.DistanceTo(target.GlobalPosition) <= maxDistance); }
public static RayCastHitInfo RayCastObject(CanvasItem spaceNode, Vector2 from, Vector2 to, out bool success) { Physics2DDirectSpaceState physicsState = Physics2DServer.SpaceGetDirectState(spaceNode.GetWorld2d().Space); Dictionary result = physicsState.IntersectRay(from, to, GodotUtility.MakeGDArray(spaceNode)); if (result.ContainsKey("position")) { success = true; RayCastHitInfo info = new RayCastHitInfo(); info.position = (Vector2)result["position"]; if (result.ContainsKey("collider")) { info.collider = (Godot.Object)result["collider"]; } return(info); } else { success = false; return(null); } }