Contenido del curso
Empezando Nuestro Proyecto
Teoría de Gameplay
Mecánica Principal
- 8

Crea la cuadrícula del juego en Unity
07:59 min - 9

Cámara ortográfica automática en Unity
13:06 min - 10

Sistema de coordenadas para piezas en Unity
05:16 min - 11

Piezas aleatorias en la cuadrícula Unity
13:39 min - 12

Mover piezas en Unity con DOTween
07:52 min - 13

Intercambio de piezas con arrays 2D en Unity
14:45 min - 14

Permitiendo solo ciertos tipos de movimientos
05:38 min - 15

Lógica de Match 3 en cuatro direcciones
16:11 min - 16

Detectar Match 3 con corrutinas en Unity
10:21 min - 17

Evitar matches por defecto en Match 3
12:29 min - 18

Colapso de columnas en un Match 3
17:31 min - 19

Combos automáticos en Match 3 con corrutinas
07:46 min - 20

Corrutinas para animar piezas en Match 3
07:35 min - 21

Mejorando la animación de las piezas
07:37 min
Publicacion
Diseño del juego
- 24

Hablemos de diseño
01:34 min - 25

Agregando un sistema de puntos
16:45 min - 26

Sistema de tiempo
07:05 min - 27

Interfaz para el sistema de tiempo
09:26 min - 28

Creando sistema de UI
06:26 min - 29

Sistema de UI reactivo al estado del juego
14:36 min - 30

Agregando funcionalidad a la pantalla de game over
09:16 min - 31

Cómo reiniciar board y puntos en Unity
Viendo ahora - 32

Agregando audio
10:05 min - 33

Terminando el juego
07:38 min
Conclusiones
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,InGameyGameOverpara 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.