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
Viendo ahora - 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
08:39 min - 32

Agregando audio
10:05 min - 33

Terminando el juego
07:38 min
Conclusiones
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 returny 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.
startMatchesrecibestartTile.x,startTile.yy el mínimo de 3 piezas iguales.endMatchesrecibeendTile.x,endTile.yy 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:
- Mover
startPiecede regreso astartTile.x, startTile.y. - Mover
endPiecede regreso aendTile.x, endTile.y. - 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
IEnumeratorno se ejecutan solas.StartCoroutinelas registra en el motor para que respeten losyield 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.