Inicializar tablero 2D con bucles anidados

Clase 9 de 31Curso de Desarrollo de Videojuegos para Móviles con Unity

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.