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 encandies[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 =newVector3( 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 =newVector3( 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.