public void CollisionBetweenSquareAndSquare(CustomSquareCollider squareA, CustomSquareCollider squareB)
    {
        if (squareA == null || squareB == null)
        {
            return;
        }

        float Ax = squareA.transform.position.x;
        float Ay = squareA.transform.position.y;
        float Bx = squareB.transform.position.x;
        float By = squareB.transform.position.y;

        //float minDistanceTest = squareA.transform.position.x + squareA.size.x - squareB.transform.position.x + squareB.size.x;

        //float distanceBetweenSquares = (Ax - Bx * Ax - Bx) + (Ay - By * Ay - By);
        float distanceBetweenSquares = Vector2.Distance(squareA.transform.position, squareB.gameObject.transform.position);

        if (distanceBetweenSquares < squareA.size.x / 2 + squareB.size.x / 2)
        {
            if ((squareA.LeftEdge < squareB.RightEdge && squareB.RightEdge < squareA.RightEdge) &&
                (squareA.TopEdge > squareB.BottomEdge && squareB.BottomEdge > squareA.BottomEdge ||
                 squareA.BottomEdge < squareB.TopEdge && squareB.TopEdge < squareA.TopEdge))
            {
                UnityEngine.MonoBehaviour.print($"Square {squareA.gameObject.name} and square {squareB.gameObject.name} Collided");

                if (squareA.PhysicsProperties.canBounce || squareB.PhysicsProperties.canBounce)
                {
                    BounceCollision(squareA, squareB);
                }
                else if (squareA.PhysicsProperties.stopOnCollide || squareB.PhysicsProperties.stopOnCollide)
                {
                    if (squareA.PhysicsProperties.stopOnCollide)
                    {
                        StopOnCollide(squareA, squareB);
                    }
                    else
                    {
                        StopOnCollide(squareB, squareA);
                    }
                }
            }
            else if ((squareA.RightEdge > squareB.LeftEdge && squareB.LeftEdge > squareA.LeftEdge) &&
                     (squareA.TopEdge > squareB.BottomEdge && squareB.BottomEdge > squareA.BottomEdge ||
                      squareA.BottomEdge < squareB.TopEdge && squareB.TopEdge < squareA.TopEdge))
            {
                BounceCollision(squareA, squareB);
            }

            eventBus.Publish(new OnPhysicsObjectCollide(squareA, squareB)); // chamando o evento. Analogo ao "Invoke".
        }
    }
    public void CollisionBetweenCircleAndSquare(CustomCircleCollider circle, CustomSquareCollider square)
    {
        if (circle == null || square == null)
        {
            return;
        }

        float Cx = circle.transform.position.x;
        float Cy = circle.transform.position.y;
        float Sx = square.transform.position.x;
        float Sy = square.transform.position.y;

        //float minDistanceTest = square.transform.position.x + square.size.x - circle.transform.position.x + circle.CircleDiameter;

        //float distanceBetweenObjects = (Cx - Sx * Cx - Sx) + (Cy - Sy * Cy - Sy);
        float distanceBetweenObjects = Vector2.Distance(square.transform.position, circle.gameObject.transform.position);

        if (distanceBetweenObjects < circle.CircleDiameter + square.size.x)
        {
            /*Testando se as bordas do circulo (circulo + raio) estão sobreponto alguma das bordas do quadrilatero em questão*/
            if (Cx + circle.CircleRadius > square.LeftEdge && Cx - circle.CircleRadius < square.RightEdge &&
                (Cy + circle.CircleRadius > square.BottomEdge && square.TopEdge > Cy - circle.CircleRadius ||
                 Cy - circle.CircleRadius < square.TopEdge && square.BottomEdge < Cy + circle.CircleRadius))
            {
                if (circle.PhysicsProperties.canBounce)
                {
                    BounceCollision(circle, square);
                }

                if (circle.PhysicsProperties.stopOnCollide || square.PhysicsProperties.stopOnCollide)
                {
                    if (circle.PhysicsProperties.stopOnCollide)
                    {
                        StopOnCollide(circle, square);
                    }
                    else
                    {
                        StopOnCollide(square, circle);
                    }
                }
                eventBus.Publish(new OnPhysicsObjectCollide(circle, square)); // chamando o evento. Analogo ao "Invoke".
            }
            else
            {
                return;
            }

            eventBus.Publish(new OnPhysicsObjectCollide(square, circle)); // chamando o evento. Analogo ao "Invoke".
        }
    }