Contenido del curso

Mecánica Principal

Cómo reiniciar board y puntos en Unity

Resumen

Reiniciar el estado de juego en Unity es clave para que un match-3 (o cualquier juego con partidas repetibles) funcione correctamente al presionar Play Again. Aquí aprendes a destruir la cuadrícula anterior, regenerar las piezas y resetear el contador de puntos usando eventos del GameManager.

¿Por qué falla el reinicio del juego al presionar Play Again?

Cuando terminas una partida y vuelves a jugar, el problema típico es que la board conserva las piezas anteriores y el contador sigue mostrando los puntos de la partida pasada. La causa es que ni la cuadrícula ni la UI están escuchando el cambio de estado del juego.

La solución pasa por suscribirse al evento OnGameStateUpdated del GameManager desde dos lugares: la clase Board y la clase PointsUI.

¿Cómo controlar la creación de piezas según el estado del juego?

En la clase Board quieres que las piezas solo se generen cuando el estado sea InGame. Si el estado pasa a GameOver, debes destruir todo lo existente.

Dentro del método donde inicia la corrutina SetupPieces, envuelve la llamada en un condicional:

csharp if (GameManager.Instance.GameState == GameManager.GameState.InGame) { StartCoroutine(SetupPieces()); }

Luego suscríbete al evento de cambio de estado y desuscríbete en OnDestroy como buena práctica:

csharp GameManager.Instance.OnGameStateUpdated.AddListener(OnGameStateUpdated);

private void OnGameStateUpdated(GameManager.GameState newState) { if (newState == GameManager.GameState.GameOver) { ClearAllPieces(); } }

¿Por qué desuscribirse en OnDestroy? Porque evita memory leaks y errores de referencia nula cuando el objeto deja de existir pero el evento sigue intentando llamarlo.

¿Cómo implementar ClearAllPieces para destruir la cuadrícula?

La función replica la estructura de creación del board, pero en lugar de instanciar piezas, las elimina recorriendo ancho y alto con dos for loops anidados:

csharp private void ClearAllPieces() { for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { ClearPieceAt(x, y); } } }

Reutilizar ClearPieceAt mantiene el código limpio y aprovecha la lógica que ya tenías para eliminar piezas individuales.

¿Cómo probar que la board se reinicia correctamente?

Una forma rápida de validar el flujo es cambiar temporalmente el estado por defecto del GameManager de InGame a Idle. Al darle play, no deberían aparecer figuras ni correr el tiempo. Eso confirma que la board respeta el estado del juego.

Vuelve a InGame, juega una partida, observa el patrón de figuras (por ejemplo, una cruz de jirafitas), espera a Game Over y pulsa Play Again. Verás una nueva distribución de figuras, señal de que la board se está regenerando.

¿Cómo reiniciar el contador de puntos en la UI?

El último detalle es el contador. Si terminaste con 36 puntos, al reiniciar seguirá mostrando 36 hasta que actualices la clase PointsUI.

En tu script de UI, además de suscribirte a OnPointsUpdated, suscríbete también a OnGameStateUpdated:

csharp GameManager.Instance.OnGameStateUpdated.AddListener(OnGameStateUpdated);

private void OnGameStateUpdated(GameManager.GameState newState) { if (newState == GameManager.GameState.GameOver) { displayedPoints = 0; pointsLabel.text = displayedPoints.ToString(); } }

No olvides hacer RemoveListener en OnDestroy para ambos eventos. Evita usar RemoveAllListeners porque podrías quitar suscripciones de otros sistemas que no controlas.

¿Qué hace AddListener en un UnityEvent? Registra una función para que se ejecute cada vez que el evento se dispara. Es la base del patrón observador en Unity.

¿Qué resultado deberías ver tras los cambios?

Al jugar una partida, acumular puntos (por ejemplo, 27), perder y presionar Play Again, deberías obtener:

  • Una nueva cuadrícula generada desde cero.
  • El contador de puntos en cero.
  • El temporizador reiniciado y corriendo de nuevo.

Con esto, tu juego soporta partidas consecutivas sin arrastrar estado de la sesión anterior.

Conceptos y habilidades que aplicaste en esta clase

Durante el desarrollo trabajaste con piezas concretas del toolkit de Unity y patrones de diseño que conviene tener claros:

  • GameState como enum: define estados como Idle, InGame y GameOver para controlar el flujo del juego [01:30].
  • UnityEvents y AddListener/RemoveListener: permiten que distintas clases reaccionen a cambios sin acoplarse directamente [01:45].
  • OnDestroy para desuscripción: buena práctica para liberar referencias y evitar errores en runtime [02:10].
  • Corrutinas con SetupPieces: ejecutan la creación de la board de forma asíncrona [01:20].
  • For loops anidados sobre width y height: patrón estándar para recorrer cuadrículas en juegos tipo match-3 [02:40].
  • Reutilización de ClearPieceAt: aplica el principio DRY al apoyarte en funciones existentes [02:55].

¿Cómo te sientes con tu progreso hasta aquí? Cuéntame en los comentarios cómo te quedó el reinicio de tu juego y qué decisión tomaste para manejar el estado.