public static object _CircleCast(FPVector2 origin, FP radius, FPVector2 direction, FP distance, Physics2D.BodySpecialSensor sensorType, int layerMask = UnityEngine.Physics.DefaultRaycastLayers)
        {
            if (distance + radius > FP.MaxValue)
            {
                distance = FP.MaxValue - radius;
            }

            direction.Normalize();

            FPVector2 offsetToCenter = ((direction * distance) * FP.Half);

            offsetToCenter.x = FP.Abs(offsetToCenter.x);
            offsetToCenter.y = FP.Abs(offsetToCenter.y);

            FP angle = FPVector2.Angle(direction, FPVector2.right);

            if (direction.x <= 0 && direction.y >= 0)
            {
                offsetToCenter.x = -offsetToCenter.x;
            }
            else if (direction.x <= 0 && direction.y <= 0)
            {
                offsetToCenter.x = -offsetToCenter.x;
                offsetToCenter.y = -offsetToCenter.y;
                angle            = -angle;
            }
            else if (direction.x >= 0 && direction.y <= 0)
            {
                offsetToCenter.y = -offsetToCenter.y;
                angle            = -angle;
            }

            FPVector2 center = origin + offsetToCenter;

            object result = _OverlapCapsule(center, new FPVector2(distance + radius * 2, radius * 2), FPCapsuleDirection2D.HORIZONTAL, -angle, sensorType, layerMask);

            if (result is FPCollider2D)
            {
                return(new FPRaycastHit2D((FPCollider2D)result));
            }
            else
            {
                FPCollider2D[]   resultAux = (FPCollider2D[])result;
                FPRaycastHit2D[] resultHit = new FPRaycastHit2D[resultAux.Length];

                for (int index = 0; index < resultHit.Length; index++)
                {
                    resultHit[index] = new FPRaycastHit2D(resultAux[index]);
                }

                return(resultHit);
            }
        }
        public FPRaycastHit2D Raycast(FPVector2 origin, FPVector2 direction, FP distance)
        {
            FPRaycastHit2D result = null;

            Func <Spax.Physics2D.Fixture, FPVector2, FPVector2, FP, FP> callback = delegate(Spax.Physics2D.Fixture fixture, FPVector2 point, FPVector2 normal, FP fraction)
            {
                result = new FPRaycastHit2D(gameObjectMap[fixture.Body].GetComponent <FPCollider2D>());
                return(0);
            };

            world.RayCast(callback, origin, origin + direction * distance);

            return(result);
        }