private void SetupPrefabs(int rows, int columns, Texture2D slicedTexture, bool tryLoadGameState) { var boardService = ServiceLocator.Get <IBoardService>(); boardService.Setup(rows * columns, pieceOutlineContainer, puzzleContainer.transform); var pieceScaleFactor = 1f + (ImgSlicer.PADDING_RATIO * 2f); BoardContext.Instance.Setup(pieceScaleFactor, puzzleContainer.topRightBounds.position, puzzleContainer.bottomLeftBounds.position); var gameStateService = ServiceLocator.Get <IGameStateService>(); gameStateService.TryLoad(expectedPieceCount: rows * columns); for (int col = 0; col < columns; ++col) { for (int row = 0; row < rows; ++row) { var pieceAnchor = puzzleContainer.GetPieceAnchor(row, col); var anchorInPool = pool.GetPieceAnchor(row, col, columns); var isOnPlayField = gameStateService.IsPieceOnPlayField(col, row); var parent = isOnPlayField ? pieceAnchor : anchorInPool; var newPrefab = Instantiate <PiecePrefab>(piecePrefabPrototype, parent, false); var uv0x = (float)col / (float)columns; var uv0y = (float)row / (float)rows; var uv3x = (float)(col + 1) / (float)columns; var uv3y = (float)(row + 1) / (float)rows; newPrefab.Setup(slicedTexture, new Vector2(uv0x, uv0y), new Vector2(uv3x - uv0x, uv3y - uv0y), col, row, isOnPlayField); newPrefab.transform.localPosition = Vector3.zero; newPrefab.transform.localScale = new Vector3(pieceScaleFactor, pieceScaleFactor); newPrefab.pieceAnchor = pieceAnchor; newPrefab.anchorInPool = anchorInPool; newPrefab.pieceOutlineContainer = pieceOutlineContainer; if (isOnPlayField) { boardService.MarkPieceOnPlayField(newPrefab); newPrefab.transform.position = gameStateService.GetWorldPosition(col, row); anchorInPool.gameObject.SetActive(false); newPrefab.TryMoveBackgroundToBackgroundDisplay(); } } } if (tryLoadGameState) { if (gameStateService.HasWon) { ReplacePiecesWithBackgroundOnVictory(0f, 0f); } else { boardService.SnapAndConnectLoadedPieces(); } } }