private void CalculateMoveProperties(int moveDistance, SegmentInfoInView segmentInfo)
        {
            float distance = DistanceToMoveElementByY * moveDistance;

            segmentInfo.MoveSteps          = (int)(distance / _moveStepY);
            segmentInfo.correctiveMoveStep = distance - segmentInfo.MoveSteps * _moveStepY;
        }
        public void MoveDownElements(ElementsMoveDownArgs args)
        {
            _movingColumnsCount = 0;
            _currentMovedColums = 0;
            foreach (KeyValuePair <int, ColumnMoveInfo> moveInfoPair in args.columnsMoveInfos)
            {
                List <SegmentInfoInView> segmentInfos = new List <SegmentInfoInView>();
                foreach (SegmentMoveInfo segment in  moveInfoPair.Value.oldElements)
                {
                    SegmentInfoInView info = new SegmentInfoInView();
                    info.elements     = GetOldElements(segment.elementsToMove);
                    info.moveDistance = segment.MoveDistance;
                    CalculateMoveProperties(segment.MoveDistance, info);
                    segmentInfos.Add(info);
                }

                SpawnHiddenElements(moveInfoPair.Value.newElements.elements, out List <MovingElement> hiddenElements);
                SegmentInfoInView newElementsSegment = new SegmentInfoInView();
                newElementsSegment.elements     = hiddenElements;
                newElementsSegment.moveDistance = moveInfoPair.Value.newElements.MoveDistance;
                CalculateMoveProperties(moveInfoPair.Value.newElements.MoveDistance, newElementsSegment);
                segmentInfos.Add(newElementsSegment);
                StartCoroutine(MoveDownColumn(segmentInfos));
                _movingColumnsCount++;
            }
        }
        private IEnumerator MoveDownColumn(List <SegmentInfoInView> segmentInfos)
        {
            int segmentsMoved       = 0;
            int totalSegmentsAmount = segmentInfos.Count;

            while (segmentsMoved < totalSegmentsAmount)
            {
                int i = 0;
                while (i < segmentInfos.Count)
                {
                    SegmentInfoInView segmentInfo = segmentInfos[i];
                    if (segmentInfo.CurrentStepAmount < segmentInfo.TotalMoveSteps)
                    {
                        float currentMoveStep = 0;
                        if (segmentInfo.CurrentStepAmount < segmentInfo.MoveSteps)
                        {
                            currentMoveStep = _moveStepY;
                        }
                        else
                        {
                            currentMoveStep = segmentInfo.correctiveMoveStep;
                        }
                        foreach (MovingElement movingElement in segmentInfo.elements)
                        {
                            movingElement.Transform.anchoredPosition -= new Vector2(0, currentMoveStep);
                        }

                        segmentInfo.CurrentStepAmount++;
                    }
                    else if (segmentInfo.CurrentStepAmount == segmentInfo.TotalMoveSteps && !segmentInfo.isMoved)
                    {
                        segmentsMoved++;
                        segmentInfo.isMoved = true;
                    }
                    i++;
                }

                yield return(null);
            }

            foreach (SegmentInfoInView segmentInfo in segmentInfos)
            {
                foreach (MovingElement element in segmentInfo.elements)
                {
                    int newRowPosition = element.Coordinate.y + segmentInfo.moveDistance;
                    _elements[element.Coordinate.x, newRowPosition] = element.Transform;
                }
            }


            CountMovedColumn();
        }