//метод производящий попытку толкнуть ящик //dir - направление толчка //moveSpeed - скорость толкания //возвращает true если толкнуть получилось иначе false public bool TryPush(MoveDirection dir, float moveSpeed) { if (moving) { return(false); } else { CellScript targetCell; if (dir == MoveDirection.Left) { targetCell = currCell.leftNeighbor; } else { targetCell = currCell.rightNeighbor; } //если сбоку и сверху нет ящика толчок разрешается bool canPush = targetCell != null && targetCell.cellObject == null && currCell.topNeighbor.cellObject == null; if (canPush) { StartCoroutine(MoveToCell(targetCell, moveSpeed)); currMove = BoxMoveType.Push; return(true); } else { return(false); } } }
private void Update() { //падение если под ящиком ничего нет bool needFall = canFall && !moving && currCell.bottomNeighbor != null && !(currCell.bottomNeighbor.cellObject is BoxScript); if (needFall) { StartCoroutine(MoveToCell(currCell.bottomNeighbor, fallSpeed)); currMove = BoxMoveType.Fall; } }
protected override void EndMoveAction() { //конец игры если ящик упал в запретную клетку bool inGameOverCell = currMove == BoxMoveType.Fall && currCell.isGameOverCell && currCell.bottomNeighbor.cellObject is BoxScript; if (inGameOverCell) { GameManagerScript.instance.GameOver(); return; } currMove = BoxMoveType.Stay; //проверка на совпадение цветов проводится если падение не будет продолжаться if (currCell.bottomNeighbor == null || currCell.bottomNeighbor.cellObject is BoxScript) { int count = 0; //подсчёт ящиков с одинаковым цветом FindBoxWithSameColor(currCell, x => count++); if (count >= 3) { //уничтожение ящиков с одинаковым цветом FindBoxWithSameColor(currCell, x => x.DestroyBox()); } } }