Caída en cascada para match-3 con corrutinas
Clase 19 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
Viendo ahora - 20

Generar caramelos sin crear matches accidentales
09:09 min - 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
Implementa una caída en cascada fluida y controlada tras destruir coincidencias de 3 o más caramelos. Con una combinación de corrutinas, control de interacción con isShifting y manejo de SpriteRenderer, lograrás un efecto visual claro y estable, listo para completar con la fase de relleno aleatorio más adelante.
¿Cómo implementar la caída en cascada con corrutinas?
La idea central es detectar huecos donde el SpriteRenderer está en null y, para cada hueco, iniciar una coroutine que desplace hacia abajo los sprites superiores en la misma columna, con un pequeño shift delay para el efecto de cascada.
- Detectar casillas con imagen nula en la matriz de candies.
- Lanzar una coroutine por columna que haga descender los sprites superiores.
- Bloquear interacción con isShifting mientras se produce la caída.
- Copiar sprites de arriba hacia abajo y anular el último.
Código orientativo del flujo descrito:
// En el BoardManager
public IEnumerator FindNullCandies() {
for (int x = 0; x < xSize; x++) {
for (int y = 0; y < ySize; y++) {
var sr = candies[x, y].GetComponent<SpriteRenderer>();
if (sr.sprite == null) {
yield return StartCoroutine(MakeCandiesFall(x, y));
break; // salir para evitar colisiones de corrutinas en el mismo barrido
}
}
}
}
private IEnumerator MakeCandiesFall(int x, int yStart, float shiftDelay = 0.05f) {
isShifting = true;
List<SpriteRenderer> renderers = new List<SpriteRenderer>();
int nullCandies = 0;
for (int i = yStart; i < ySize; i++) {
var sr = candies[x, i].GetComponent<SpriteRenderer>();
if (sr.sprite == null) nullCandies++;
renderers.Add(sr);
}
for (int i = 0; i < nullCandies; i++) {
yield return new WaitForSeconds(shiftDelay);
for (int j = 0; j < renderers.Count - 1; j++) {
renderers[j].sprite = renderers[j + 1].sprite;
renderers[j + 1].sprite = null;
}
}
isShifting = false;
}
¿Qué hace cada método clave y por qué es importante?
Este enfoque divide responsabilidades para mantener el código legible y fácil de depurar. Además, las coroutines se “autogobiernan”, pausando y reanudando su ejecución cuando lo necesitan.
¿Cómo detecta FindNullCandies los huecos sin imagen?
- Recorre toda la matriz con doble bucle for.
- Consulta GetComponent
y verifica si sprite == null. - Lanza
yield return StartCoroutine(...)para esperar la caída de esa columna. - Usa
breaktras iniciar la coroutine para evitar múltiples disparos simultáneos.
¿Cómo desplaza MakeCandiesFall los sprites hacia abajo?
- Activa isShifting = true al inicio y la desactiva al final.
- Crea una List
desde yStarthasta el tope de la columna. - Cuenta
nullCandiespara conocer cuántos descensos ejecutar. - Aplica un
yield return new WaitForSeconds(shiftDelay)en cada iteración. - Copia el sprite de
j+1ajy dejaj+1en null para simular la caída.
¿Cómo mejora la experiencia el shift delay y el control de interacción?
- El shift delay por defecto
0.05faporta un efecto de cascada claro y agradable. - isShifting previene que el jugador interactúe durante la animación.
- El resultado es una caída progresiva, visualmente coherente y sin interferencias.
¿Cómo activar la caída desde el script del caramelo?
Tras el swap y la evaluación de matches, es buen momento para disparar la detección de huecos. Antes, conviene frenar cualquier coroutine anterior para evitar solapamientos.
// En el script Candy, tras el swap y los matches
StopCoroutine(BoardManager.sharedInstance.FindNullCandies());
StartCoroutine(BoardManager.sharedInstance.FindNullCandies());
Buenas prácticas en esta fase: - Frenar la coroutine previa antes de iniciar otra. - Mantener el control con isShifting durante la caída. - Ajustar el shift delay si buscas un efecto más marcado. - Preparar la fase siguiente: rellenar los huecos superiores con nuevos caramelos aleatorios.
¿Te gustaría comentar cómo ajustarías el delay o qué estrategia seguirías para el relleno aleatorio posterior?