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.

      Corrutinas para pantalla Game Over sin interrupciones