Generar caramelos sin crear matches accidentales
Clase 20 de 31 • Curso de Desarrollo de Videojuegos para Móviles con Unity
Contenido del curso
Sprite Atlas y Generación de Caramelos
- 5

Sprite Editor y cámaras en Unity para móviles
11:53 min - 6

Sprites múltiples en Unity con slice automático
12:06 min - 7

Script base de Candy en Unity C#
10:57 min - 8

Configuración y Gestión del Tablero en Unity con C#
10:08 min - 9

Inicializar tablero 2D con bucles anidados
10:27 min - 10

Configuración de slice por tamaño en Unity
05:22 min - 11

Creación y Configuración de Tablero en Unity para Videojuegos
08:22 min - 12

Sprites aleatorios de prefabs en Unity
07:18 min
Diseño de Game Play
- 13

Arreglar bug de tripletes en tablero Candy Crush
12:33 min - 14

OnMouseDown para seleccionar caramelos
12:14 min - 15

Swap de caramelos sin mover GameObject
10:17 min - 16

Configuración de Física en Unity para Movimiento de Caramelos
13:30 min - 17

Detección y Eliminación de Coincidencias en Candy Crush
12:06 min - 18

Anular sprites en lugar de destruir objetos
15:26 min - 19

Caída en cascada para match-3 con corrutinas
13:23 min - 20

Generar caramelos sin crear matches accidentales
Viendo ahora - 21

Último bug visual: rebotes y recálculos
10:55 min
Retos finales
- 22

Diseño de Interfaz Gráfica en Unity para Videojuegos
11:20 min - 23

Variables autocomputadas en Unity GUI Manager
07:31 min - 24

Implementación de Singleton en Gestor de Interfaz de Usuario
08:13 min - 25

Corrutinas para pantalla Game Over sin interrupciones
06:55 min - 26

Multiplica puntuación con combos inteligentes
04:46 min - 27

Integra tres audios en tu videojuego de caramelos
01:47 min - 28

Animación y Destrucción de Caramelos en Videojuegos
02:00 min - 29

Menú principal para tu videojuego móvil
03:28 min
Cierre del curso
Domina una técnica fiable para rellenar huecos en un tablero match‑3 en Unity sin provocar coincidencias accidentales. Aprenderás a generar un caramelo nuevo por posición con control de vecinos, a evitar referencias no deseadas en listas y a integrarlo con la caída de piezas vía corrutinas para completar la parrilla.
¿Cómo rellenar huecos del tablero sin crear matches?
El manager es responsable del tablero y, por tanto, de rellenar los huecos que quedan cuando los caramelos descienden. La idea central: un método que devuelva el sprite del nuevo caramelo para una coordenada (x, y), filtrando opciones que provoquen un match horizontal o vertical inmediato.
- Crear un método: devuelve un Sprite, por ejemplo, GetNewCandy(x, y). Genera un único caramelo por posición.
- Construir una lista temporal con todos los prefabs posibles del juego. Luego, eliminar los que no se pueden colocar por ser vecinos directos.
- Seleccionar aleatoriamente entre los candidatos válidos con Random.Range.
Ejemplo de implementación en C#:
private Sprite GetNewCandy(int x, int y)
{
// Clonar la lista de prefabs originales (no referenciarla).
List<Sprite> possibleCandies = new List<Sprite>();
possibleCandies.AddRange(prefabsOriginales);
// Evitar repetir con el vecino de la izquierda.
if (x > 0)
possibleCandies.Remove(tablero[x - 1, y].GetComponent<SpriteRenderer>().sprite);
// Evitar repetir con el vecino de la derecha.
if (x < xSize - 1)
possibleCandies.Remove(tablero[x + 1, y].GetComponent<SpriteRenderer>().sprite);
// Evitar repetir con el vecino de abajo.
if (y > 0)
possibleCandies.Remove(tablero[x, y - 1].GetComponent<SpriteRenderer>().sprite);
// Elegir uno al azar entre los candidatos restantes.
return possibleCandies[UnityEngine.Random.Range(0, possibleCandies.Count)];
}
¿Por qué copiar listas en vez de referenciarlas?
En programación orientada a objetos, asignar una lista a otra crea una referencia, no una copia. Aquí se necesita una copia para partir de los valores originales y eliminar opciones sin alterar la lista base de prefabs del manager.
- Evitar efectos colaterales al modificar la lista global.
- Trabajar con un subconjunto temporal por posición.
- Mantener los prefabs originales intactos.
¿Qué vecinos se excluyen al generar un caramelo?
Se filtran los vecinos que podrían forzar un tres en raya inmediato. No se comprueba hacia arriba porque el hueco está precisamente en la zona superior tras la caída.
- Izquierda: si x > 0, eliminar el sprite de x−1, y.
- Derecha: si x < xSize−1, eliminar el sprite de x+1, y.
- Abajo: si y > 0, eliminar el sprite de x, y−1.
- Arriba: no aplica, el hueco está arriba tras el descenso.
¿Cómo integrar la generación con la caída de caramelos?
En el método que hace caer las piezas (por ejemplo, MakeCandyFall), antes se dejaban posiciones en null al desplazar hacia abajo. En lugar de mantener el null, se debe invocar al generador para reponer el caramelo en la parte superior de la columna.
- Usar ySize como tamaño de la parrilla vertical.
- Colocar el nuevo caramelo en la fila ySize−1 (arriba del todo).
- Dejar que las corrutinas hagan descender el caramelo automáticamente.
Fragmento orientativo:
// Donde antes quedaba null, reponer en la fila superior.
tablero[x, ySize - 1] = GetNewCandy(x, ySize - 1);
¿Qué se observa al probar en Unity?
Las pruebas en el editor muestran el flujo funcionando de principio a fin.
- Las columnas caen y se rellenan con nuevos caramelos.
- No hay problemas en vertical ni en horizontal al mover piezas.
- El ojo ve aparecer el nuevo caramelo arriba y, por corrutinas, desciende hasta completar la parrilla.
¿Qué mejora falta: detección de cascadas?
Queda un bug pendiente: tras la caída y el rellenado, el algoritmo no detecta nuevas alineaciones formadas por efecto dominó. Debe ser capaz de:
- Detectar cuando aparecen tres o más en línea tras una caída.
- Repetir el proceso de eliminar, caer y rellenar de forma recurrente.
- Continuar mientras exista alguna posibilidad de elementos alineados.
¿Te gustaría comentar cómo detectarías esas cascadas o qué estructura de control usarías para repetir el chequeo de alineaciones?