Último bug visual: rebotes y recálculos
Clase 21 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
09:09 min - 21

Último bug visual: rebotes y recálculos
Viendo ahora
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
Un flujo sólido de destrucción y reposición es clave para un gameplay sin trampas. Aquí verás cómo cerrar el último bug visual en un clon de Candy Crush en Unity: recalcular coincidencias tras cada caída, usar corutinas y aplicar un bucle exhaustivo sobre la matriz para garantizar que no queden alineaciones colaterales.
¿Cómo asegurar el tablero tras las destrucciones en cascada?
Para impedir que el usuario explote coincidencias indirectas, se fuerza un rechequeo global solo cuando todos los caramelos han caído y se han recolocado. La idea: recorrer toda la matriz y pedir a cada caramelo que busque nuevas coincidencias. Es pesado, sí, pero se ejecuta puntualmente tras recomponer, por lo que el impacto en móviles es asumible.
- Recalcular tras destruir y reposicionar objetos.
- Comprobar alineaciones con elementos adyacentes en toda la matriz.
- Usar un doble bucle con límites de tablero: xSize y ySize.
- Optimizar para móvil: el bucle corre solo cuando termina la recomposición.
Ejemplo del bucle que invoca a cada caramelo su búsqueda de matches:
for (int x = 0; x < xSize; x++) {
for (int y = 0; y < ySize; y++) {
candies[x, y].GetComponent<Candy>().FindAllMatches();
}
}
Conceptos clave que intervienen aquí: la matriz candies, el acceso con GetComponent
¿Qué hace findAllMatches y cómo encadena clearMatch y getNewCandy?
En el script de Candy, FindAllMatches valida si el caramelo existe y, si procede, busca coincidencias horizontales o verticales de tres o más. Si hay match, se anula el sprite del actual y, mediante ClearMatch, también el de los vecinos. Esto deja nulos que activan la corutina que encuentra nulos, hace caer piezas y genera nuevas con getNewCandy.
- Validación de caramelo nulo: si es nulo, no actúa.
- Búsqueda en horizontal o vertical de 3 o más.
- Anulación gráfica con
sprite = nullpara actual y vecinos en ClearMatch. - Caída por rebote: la corutina vuelve a detectar nulos y rellena.
- Repetición recursiva hasta que no haya coincidencias pendientes.
Tras detectar una destrucción, es obligatorio disparar la búsqueda de nulos desde el gestor del tablero para completar la cadena de caídas y relleno:
if (matchHorizontal || matchVertical) {
BoardManager.sharedInstance.FindNullCandies();
}
Así se garantiza que el ciclo continúa: anulación gráfica, detección de nulos, caída, generación con getNewCandy y nueva llamada a FindAllMatches hasta estabilizar el tablero sin tríos ni más alineaciones.
¿Qué cambio realizar en on mousedown y en la corutina para estabilidad?
El gesto de swipe vivía en OnMouseDown y allí se arrancaba la corutina para encontrar nulos. El ajuste final es mover esa lógica al propio FindAllMatches: cuando haya una combinación válida, se detienen comprobaciones anteriores y se inicia una nueva búsqueda de nulos. Esto reinicia el ciclo con cada match, incluso si ocurre a mitad de una cadena de caídas, y asegura un tablero coherente tras los rebotes.
- Mover la invocación de la corutina desde OnMouseDown hacia FindAllMatches.
- Reiniciar la búsqueda cada vez que hay una combinación válida.
- Permitir que los rebotes recalculen toda la matriz.
- Evitar que queden tríos residuales o que el jugador fuerce trampas.
Ilustración de la reasignación de responsabilidades:
// Antes (en OnMouseDown):
// ... detectar swipe, intercambiar, destruir ...
// BoardManager.sharedInstance.FindNullCandies(); // se invocaba aquí
// Ahora (en FindAllMatches, solo si hay match válido):
if (matchHorizontal || matchVertical) {
// anular sprites del actual y vecinos mediante ClearMatch
BoardManager.sharedInstance.FindNullCandies(); // reinicia la búsqueda de nulos
}
Este ciclo produce caídas encadenadas fiables, incluidas formas como una T, y múltiples rebotes consecutivos hasta ver el resultado final limpio para que el jugador siga moviendo caramelos con normalidad.
¿Te funcionó esta estrategia o harías otro ajuste al flujo de corutinas y bucles? Comparte tus dudas o mejoras en comentarios.