private void updateItemsPositions(out int itemsMoved)
    {
        itemsMoved = 0;
        for (int i = 0; i < gridParams.ROWS; i++)
        {
            for (int j = 0; j < gridParams.COLS; j++)
            {
                Match3Item item = items[i][j];

                if (item.IsMarkedForRemoving)
                {
                    continue;
                }

                float endY = item.ROW * gridParams.CELL_WIDTH;
                if (item.transform.localPosition.y > endY)
                {
                    item.IsMovingDown = true;
                    float delta = item.transform.localPosition.y - endY;
                    item.transform.localPosition = new Vector2(item.transform.localPosition.x, item.transform.localPosition.y - Mathf.Min(delta, gridParams.fallSpeed));
                    itemsMoved++;
                }
                else if (item.transform.localPosition.y == endY && item.IsMovingDown)
                {
                    item.IsMovingDown = false;
                    item.OnStopMovingDown();
                }
            }
        }
    }
    private void HandleItemClick(Match3Item clickedItem)
    {
        if (!playerCanMakeTurn.Value)
        {
            return;
        }

        clickedItem.OnClicked -= HandleItemClick;
        SelectSameTypeCardsAroundClicked(clickedItem.ROW, clickedItem.COL, clickedItem.Data.itemType);
        CreateNewItemsInsteadOfRemoving();
        RemoveSelectedItems();
    }
    private void InitItems()
    {
        if (match3ItemFactory == null)
        {
            Debug.LogWarning("Please set match 3 item factory");
            return;
        }

        items = new Match3Item[gridParams.ROWS][];
        for (int row = 0; row < gridParams.ROWS; row++)
        {
            items[row] = new Match3Item[gridParams.COLS];
            for (int col = 0; col < gridParams.COLS; col++)
            {
                AddNewItem(row, col, -1);
            }
        }
    }
    private void CreateItemsOnColumn(Match3Item item)
    {
        int        amountNeededToCreate = 0;
        int        lowestEmptyRow       = -1;
        Match3Item tempItem;

        for (int row = gridParams.ROWS - 1; row >= 0; row--)
        {
            tempItem = items[row][item.COL];
            if (tempItem.IsMarkedForRemoving)
            {
                amountNeededToCreate++;
                lowestEmptyRow = tempItem.ROW;
            }
        }

        if (amountNeededToCreate == 0)
        {
            return;
        }

        if (lowestEmptyRow > -1)
        {
            int rowOffsetForExistingItems = 0;
            for (int row = lowestEmptyRow; row < gridParams.ROWS; row++)
            {
                tempItem = items[row][item.COL];

                if (tempItem.IsMarkedForRemoving)
                {
                    rowOffsetForExistingItems++;
                    continue;
                }

                tempItem.ROW -= rowOffsetForExistingItems;
                items[tempItem.ROW][item.COL] = tempItem;
            }
        }

        for (int row = 0; row < amountNeededToCreate; row++)
        {
            AddNewItem(gridParams.ROWS - 1 - row, item.COL, amountNeededToCreate - row);
        }
    }
    private void AddNewItem(int row, int col, int addingRowOffsetInd)
    {
        GameObject newItemObject;

        newItemObject = match3ItemFactory.GetItem();
        newItemObject.transform.parent = transform;

        Match3Item newItem = newItemObject.GetComponent <Match3Item>();

        newItem.IsMarkedForRemoving = false;
        items[row][col]             = newItem;
        items[row][col].SetRowAndCol(row, col);
        float startX = col * gridParams.CELL_WIDTH - gridParams.COLS * .5f * gridParams.CELL_WIDTH + gridParams.CELL_WIDTH * .5f;
        float startY = row * gridParams.CELL_WIDTH + (gridParams.ROWS + row + col) * gridParams.CELL_WIDTH;

        if (addingRowOffsetInd > -1)
        {
            startY = gridParams.ROWS * gridParams.CELL_WIDTH + addingRowOffsetInd * gridParams.CELL_WIDTH;
        }
        items[row][col].transform.localPosition = new Vector2(startX, startY);
        newItem.OnClicked += HandleItemClick;
    }