// Genera todos los bloques de la matriz // No se utiliza GetLowerBound ni GetUpperBound porque sabemos que son matrices que siempre empiezan en cero y acaban en positivo private void GenerateBlocks(SlidingPuzzle puzzle) { if (puzzle == null) { throw new ArgumentNullException(nameof(puzzle)); } var rows = blocks.GetLength(0); var columns = blocks.GetLength(1); for (var r = 0u; r < rows; r++) { for (var c = 0u; c < columns; c++) { MovableBlock block = blocks[r, c]; if (block == null) { // Crea un ejemplar del prefab de bloque en la posición correcta según su posición en la matriz (podrían hacerse hijos del tablero) // Se asume un tablero en (0f, 0f, 0f) aunque debería tomarse la posición real del tablero como referencia block = Instantiate(blockPrefab, new Vector3(-((blocks.GetLength(1) / 2.0f) * POSITION_FACTOR_C - (POSITION_FACTOR_C / 2.0f)) + c * POSITION_FACTOR_C, 0, (blocks.GetLength(0) / 2.0f) * POSITION_FACTOR_R - (POSITION_FACTOR_R / 2.0f) - r * POSITION_FACTOR_R), Quaternion.identity); // En Y, que es la separación del board, estoy poniendo 0 pero la referencia la debería dar el Board blocks[r, c] = block; } // Estuviera o no ya creado el bloque, se inicializa y reposiciona Position position = new Position(r, c); block.position = position; uint value = puzzle.GetValue(position); // El texto que se pone en el bloque es el valor +1, salvo si es el último valor, que no se mandará texto para que sea un bloque no visible if (value == 0) { block.Initialize(this, null); } else { block.Initialize(this, value.ToString()); } Debug.Log(ToString() + "generated " + block.ToString() + "."); } } }