Corrutinas para pantalla Game Over sin interrupciones

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

Resumen

Aprende a implementar una pantalla de game over en Unity con C#: dispara el final cuando el contador de movimientos llega a cero, usa una coroutine para respetar las animaciones finales y diseña una escena informativa con puntuación y opciones de reinicio. Así garantizas una experiencia pulida y sin cortes bruscos.

¿Cómo y cuándo activar la pantalla de game over?

La condición clave es el contador de movimientos. Cuando llegue a cero, el sistema debe activar el game over desde el setter del contador en el gestor de la interfaz (GUI manager). Asegura robustez usando la comparación menor o igual que cero para evitar negativos.

  • Comprobación segura: if (moveCounter <= 0).
  • Normalización del estado: asignar moveCounter = 0.
  • Evitar Update vacío: elimina métodos no usados para mantener el código limpio.
  • Invocación diferida: en lugar de llamar directo, arrancar una coroutine para la transición.

¿Cómo escribir el código en C#?

// Dentro del GUI Manager o clase que gestiona el contador
private int moveCounter;
public int MoveCounter
{
    get => moveCounter;
    set
    {
        moveCounter = value;
        if (moveCounter <= 0)
        {
            moveCounter = 0;
            StartCoroutine(GameOver()); // Arranca la corrutina.
        }
    }
}

// Corrutina de transición a Game Over
private IEnumerator GameOver()
{
    // Espera a que termine la caída/repintado de piezas
    yield return new WaitUntil(() => !BoardManager.SharedInstance.IsShifting);

    // Margen para que el jugador vea el resultado final del último movimiento
    yield return new WaitForSeconds(0.25f);

    // TODO: invocar la pantalla/escena de Game Over.
}

¿Por qué usar una coroutine para la transición?

Llamar a game over inmediatamente tras el último movimiento es frustrante: el jugador no alcanza a ver su jugada final ni el incremento de puntos. Con una coroutine controlas el timing y respetas las animaciones.

  • Variable de sincronización: BoardManager.SharedInstance.IsShifting.
  • Momento exacto: esperar a que IsShifting sea false usando una expresión lambda.
  • Pausa breve: añadir WaitForSeconds(0.25f) como regalo visual.
  • Beneficio UX: el usuario aprecia el colofón del nivel sin cortes.

¿Cómo sincronizar con el tablero usando WaitUntil?

La clave es usar WaitUntil con una condición legible y precisa.

// Espera hasta que el tablero deje de "moverse"
yield return new WaitUntil(() => !BoardManager.SharedInstance.IsShifting);

// Pequeño margen para ver puntuación y estado final
yield return new WaitForSeconds(0.25f);

Puntos a dominar: - Expresión lambda: () => !BoardManager.SharedInstance.IsShifting. - Estado del tablero: IsShifting en true durante la caída; false al finalizar. - Transición ordenada: primero sincronizas, luego concedes el margen, y finalmente navegas a game over.

¿Qué debe incluir la escena de game over?

Crea una escena dedicada con elementos claros y accionables. Muestra resultados y ofrece opciones rápidas al jugador para seguir o salir.

  • Información principal: puntuación actual de la partida.
  • Métrica persistente: puntuación máxima global usando PlayerPrefs (valores enteros) para guardado en disco, también en móvil.
  • Controles esenciales: botón para volver a jugar y botón para ir al menú principal.
  • Diseño funcional: jerarquía visual, textos legibles y botones accesibles.

Sugerencias prácticas: - Inicializa la puntuación máxima a cero y actualízala si la actual la supera. - Estructura la UI con un área para el marcador y otra para acciones. - Mantén la navegación coherente: reiniciar nivel o regresar al menú original.

¿Te animas a crear tu propia pantalla de game over y compartirla? Cuéntame en comentarios cómo resolviste la sincronización con IsShifting y la gestión de la puntuación con PlayerPrefs.