Caída en cascada para match-3 con corrutinas

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

Resumen

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 break tras 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 yStart hasta el tope de la columna.
  • Cuenta nullCandies para conocer cuántos descensos ejecutar.
  • Aplica un yield return new WaitForSeconds(shiftDelay) en cada iteración.
  • Copia el sprite de j+1 a j y deja j+1 en 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.05f aporta 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?