public void FallGemsIntoEmptyPositions()
    {
        for (int x = 0; x < gridWidth; x++)
        {
            for (int y = 0; y < gridHeight; y++)
            {
                GemGridPosition gemGridPosition = grid.GetGridObject(x, y);

                if (!gemGridPosition.IsEmpty())
                {
                    // Grid Position has Gem
                    for (int i = y - 1; i >= 0; i--)
                    {
                        GemGridPosition nextGemGridPosition = grid.GetGridObject(x, i);
                        if (nextGemGridPosition.IsEmpty())
                        {
                            gemGridPosition.GetGemGrid().SetGemXY(x, i);
                            nextGemGridPosition.SetGemGrid(gemGridPosition.GetGemGrid());
                            gemGridPosition.ClearGemGrid();

                            gemGridPosition = nextGemGridPosition;
                        }
                        else
                        {
                            // Next Grid Position is not empty, stop looking
                            break;
                        }
                    }
                }
            }
        }
    }
    private GemSO GetGemSO(int x, int y)
    {
        if (!IsValidPosition(x, y))
        {
            return(null);
        }

        GemGridPosition gemGridPosition = grid.GetGridObject(x, y);

        if (gemGridPosition.GetGemGrid() == null)
        {
            return(null);
        }

        return(gemGridPosition.GetGemGrid().GetGem());
    }
    public void SwapGridPositions(int startX, int startY, int endX, int endY)
    {
        if (!IsValidPosition(startX, startY) || !IsValidPosition(endX, endY))
        {
            return;                                                                   // Invalid Position
        }
        if (startX == endX && startY == endY)
        {
            return;                                   // Same Position
        }
        GemGridPosition startGemGridPosition = grid.GetGridObject(startX, startY);
        GemGridPosition endGemGridPosition   = grid.GetGridObject(endX, endY);

        GemGrid startGemGrid = startGemGridPosition.GetGemGrid();
        GemGrid endGemGrid   = endGemGridPosition.GetGemGrid();

        startGemGrid.SetGemXY(endX, endY);
        endGemGrid.SetGemXY(startX, startY);

        startGemGridPosition.SetGemGrid(endGemGrid);
        endGemGridPosition.SetGemGrid(startGemGrid);
    }