Contenido del curso

Mecánica Principal

Detectar Match 3 con corrutinas en Unity

Resumen

Detectar un Match 3 en Unity requiere coordinar el movimiento de piezas, la búsqueda de coincidencias y la eliminación de elementos en pantalla. Aquí verás cómo transformar la función SwapTiles en una corrutina para que el jugador vea cada paso del intercambio y la mecánica funcione correctamente dentro del board.

Por qué necesitas una corrutina para intercambiar piezas

Cuando mueves dos piezas en un juego Match 3, no basta con cambiar sus posiciones de inmediato. Necesitas que el jugador vea la animación, que el sistema busque coincidencias y que, si no las hay, las piezas regresen a su lugar.

¿Qué es una corrutina en Unity? Es una función que puede pausar su ejecución con yield return y reanudarla después. Ideal para animaciones o esperas sin bloquear el juego.

Para lograrlo, la función deja de ser void y pasa a ser un IEnumerator. Ese cambio te permite usar yield return new WaitForSeconds(0.6f) y darle tiempo a las piezas para llegar a su nueva posición antes de evaluar el tablero [01:30].

Cómo evitar movimientos simultáneos con una bandera booleana

Antes de tocar la lógica del intercambio, agrega al inicio del script board una variable booleana llamada swappingPieces, inicializada en false [00:25]. Esta bandera bloquea nuevos movimientos mientras el sistema sigue procesando el anterior.

La idea es simple: solo puedes mover un par de piezas a la vez. Hasta que el proceso de detección termine, el jugador no podrá iniciar otro intercambio.

Cómo buscar matches con GetMatchesByPiece

Una vez que las piezas terminan de moverse, declaras una variable foundMatch en false para registrar si hubo coincidencias. Después llamas a GetMatchesByPiece dos veces, una para cada pieza involucrada en el swap.

  • startMatches recibe startTile.x, startTile.y y el mínimo de 3 piezas iguales.
  • endMatches recibe endTile.x, endTile.y y también un mínimo de 3.
  • Ambas variables guardan las listas de piezas que forman match.

Con estas dos listas en mano, recorres cada una con foreach y, por cada pieza encontrada, marcas foundMatch como true, asignas null en el array bidimensional de piezas y llamas a Destroy(piece.gameObject) para sacarla del tablero.

Qué hacer cuando no se encuentra ningún match

Si foundMatch permanece en false, significa que el movimiento fue inválido y debes devolver las piezas a su posición original. Esa es la regla clásica del Match 3: solo puedes mover piezas que generen una coincidencia.

El reinicio implica tres acciones:

  1. Mover startPiece de regreso a startTile.x, startTile.y.
  2. Mover endPiece de regreso a endTile.x, endTile.y.
  3. Restaurar el array de piezas para que cada coordenada apunte de nuevo a su pieza original.

Después de esto, igualas startTile y endTile a null, pones swappingPieces en false y cierras la corrutina con yield return null [04:30]. El reseteo de startTile y endTile se mueve fuera de TileUp porque, si se hiciera ahí, esos valores ya estarían vacíos cuando la corrutina retomara su ejecución.

Cómo iniciar la corrutina desde TileUp

Dentro de TileUp, la llamada a SwapTiles cambia. Como ahora es un IEnumerator, necesitas envolverla en StartCoroutine(SwapTiles(...)). Sin esa envoltura, Unity no ejecutará la lógica asíncrona y nada se moverá.

¿Por qué usar StartCoroutine en lugar de llamar la función directamente? Porque las funciones IEnumerator no se ejecutan solas. StartCoroutine las registra en el motor para que respeten los yield return.

El bug del signo que rompe la detección

Al correr el juego por primera vez, los matches no se detectan. El problema no está en SwapTiles ni en GetMatchesByPiece, sino más adentro: en GetMatchesByDirection, la función que recorre el tablero en cada eje.

Dentro del for que aumenta las coordenadas para revisar piezas vecinas, aparece un signo de multiplicación (*) donde debería ir un signo de suma (+) al incrementar nextY [06:50]. Ese pequeño detalle impide que el algoritmo avance correctamente y, por lo tanto, nunca encuentra coincidencias.

Una vez corregido el operador, el juego detecta tres jirafas alineadas, tres monitos y cualquier otra combinación válida de tres piezas iguales. Las piezas desaparecen de la cuadrícula y el sistema queda listo para el siguiente movimiento.

Por qué leer el código línea por línea acelera tu aprendizaje

La mecánica del Match 3 combina corrutinas, listas, arrays bidimensionales y funciones recursivas en cadena. Si algo falla, el problema puede estar a varios niveles de profundidad, como pasó con el operador equivocado en GetMatchesByDirection.

Leer cada línea, entender qué hace y rastrear el flujo desde TileUp hasta GetMatchesByDirection te entrena para depurar cualquier sistema complejo. ¿Te quedó alguna duda con la corrutina o con la detección de matches? Déjala en los comentarios.