Curso de Desarrollo de Videojuegos para Móviles con Unity

Corrutinas para pantalla Game Over sin interrupciones

Curso de Desarrollo de Videojuegos para Móviles con Unity

Contenido del curso

Diseño de Game Play

Retos finales

Corrutinas para pantalla Game Over sin interrupciones

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.