Curso de Desarrollo de Videojuegos para Móviles con Unity

Inicializar tablero 2D con bucles anidados

Curso de Desarrollo de Videojuegos para Móviles con Unity

Contenido del curso

Diseño de Game Play

Retos finales

Inicializar tablero 2D con bucles anidados

Resumen

Aprende a inicializar una matriz 2D de GameObject en Unity paso a paso: crear el array, calcular posiciones con offset, instanciar con Instantiate y nombrar cada pieza para depurar rápido. Todo con un enfoque claro y práctico, ideal para tableros tipo match-3.

¿Cómo se organiza el tablero 2D con arrays y bucles?

Empezamos creando la matriz 2D que guardará cada caramelo. La estructura es GameObject[,] y sus dimensiones dependen de x size (columnas) e y size (filas). Luego, dos bucles for anidados recorren columnas y filas para poblar el tablero.

  • Crear candies como new GameObject[xSize, ySize].
  • Usar for (int x = 0; x < xSize; x++) y, dentro, for (int y = 0; y < ySize; y++).
  • Instanciar un newCandy y guardarlo en candies[x, y].

¿Qué significan x size e y size en columnas y filas?

  • x size controla columnas: cuántos elementos caben de izquierda a derecha.
  • y size controla filas: cuántos elementos caben de abajo a arriba.
  • Pensar en columnas para x e hileras para y evita confusiones al indexar.

¿Por qué usar dos bucles for anidados?

  • Cada iteración en x coloca una columna completa.
  • Cada iteración en y coloca una fila dentro de esa columna.
  • Dos índices (x, y) permiten mapear posición lógica a posición en pantalla y al array.

¿Cómo calcular la posición con start x, start y y offset?

Primero se toman las coordenadas base del tablero con this.transform.position.x y this.transform.position.y, guardadas en start x y start y. A partir de ahí, cada casilla se desplaza con un offset en x e y multiplicado por los índices del bucle.

  • start x y start y: punto de inicio de la rejilla.
  • offset.x: ancho del caramelo o separación horizontal.
  • offset.y: alto del caramelo o separación vertical.
  • Fórmula de posición: start + (offset * índice).

Ejemplo directo en C#:

float startX = this.transform.position.x; float startY = this.transform.position.y; Vector3 position = new Vector3( startX + offset.x * x, startY + offset.y * y, 0f // z sin profundidad );

¿Qué es un new Vector3 en un juego 2D?

  • Aunque sea 2D, Unity trabaja en 3D sin profundidad.
  • La z se fija en 0 para evitar desplazamientos no deseados.
  • Se usan las tres coordenadas: x, y y z = 0.

¿Cómo instanciar, rotar y nombrar cada GameObject con instantiate?

Se parte de un prefab base, aquí llamado currentCandy (el placeholder cuadrado). Se instancia en la posición calculada y con la rotación original del prefab. Luego se nombra con su columna y fila, y se guarda en el array.

  • Usar Instantiate con tres parámetros: objeto, posición y rotación.
  • Mantener currentCandy.transform.rotation para alinear bien el sprite.
  • Nombrar cada instancia con string.Format("candy[{0}][{1}]", x, y).
  • Guardar la referencia en candies[x, y].

Fragmento clave en C#:

for (int x = 0; x < xSize; x++) { for (int y = 0; y < ySize; y++) { Vector3 pos = new Vector3( startX + offset.x * x, startY + offset.y * y, 0f ); GameObject newCandy = Instantiate(currentCandy, pos, currentCandy.transform.rotation); newCandy.name = string.Format("candy[{0}][{1}]", x, y); candies[x, y] = newCandy; } }

¿Para qué sirve nombrar con columna y fila?

  • Facilita la depuración visual: verás en el Hierarchy cada caramelo como candy[x][y].
  • Permite identificar rápidamente qué instancia corresponde a cada posición.
  • Ayuda cuando hay muchas piezas en pantalla y es difícil distinguirlas.

¿Quieres profundizar en variantes de posicionamiento o en cómo ajustar el origen del tablero desde el editor? Comparte tus dudas y casos de uso en los comentarios.