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

Agregando audio
10:05 min - 33

Terminando el juego
07:38 min
Conclusiones
Lógica de Match 3 en cuatro direcciones
Resumen
Detectar un Match 3 en Unity requiere comparar piezas iguales en cuatro direcciones desde una posición inicial. Aquí aprendes a programar dos funciones en C# que escanean la cuadrícula y devuelven las coincidencias listas para usarse en la lógica del juego, ideal si ya estás construyendo un match-3 puzzle.
La idea es simple: una función busca piezas iguales en una sola dirección, y otra función reutiliza esa primera para revisar arriba, abajo, izquierda y derecha. Todo se implementa dentro de la clase Board.
¿Qué hace la función GetMatchByDirection en Unity?
Esta función recorre la cuadrícula desde una posición inicial siguiendo un vector de dirección y devuelve una lista con todas las piezas del mismo tipo que encuentra antes de toparse con una distinta o salirse del tablero [02:15].
La firma queda así: recibe int xPos, int yPos, Vector2 direction y un int minPieces con valor por defecto de 3. Retorna una List<Piece>.
¿Por qué el valor mínimo de piezas es 3? Porque un Match 3 requiere al menos tres piezas iguales alineadas. Si encuentras solo dos, no cuenta como coincidencia válida y la función devuelve
null.
¿Cómo se itera en una sola dirección sin salirse de la cuadrícula?
Dentro de la función inicializas una lista vacía matches y agregas la startPiece (la pieza ubicada en xPos, yPos). Luego defines un maxValue con el mayor entre width y height usando un operador ternario.
El for loop arranca en i = 1 y avanza mientras i < maxValue. En cada iteración calculas la próxima posición con esta lógica:
nextX = xPos + (int)direction.x * i.nextY = yPos + (int)direction.y * i.- Validas que
nextXynextYestén dentro de[0, width)y[0, height).
Si la posición es válida, obtienes nextPiece desde el array bidimensional. Si no es nula y su pieceType coincide con el de startPiece, la agregas a matches. Si no coincide o es nula, ejecutas break para romper el loop [05:40].
¿Cuándo retornar la lista de matches?
Al salir del loop, comparas matches.Count contra minPieces. Si es mayor o igual, devuelves matches. Si no, devuelves null.
csharp public List<Piece> GetMatchByDirection(int xPos, int yPos, Vector2 direction, int minPieces = 3) { List<Piece> matches = new List<Piece>(); Piece startPiece = pieces[xPos, yPos]; matches.Add(startPiece);
int nextX; int nextY; int maxValue = width > height ? width : height; for (int i = 1; i < maxValue; i++) { nextX = xPos + (int)direction.x * i; nextY = yPos + (int)direction.y * i; if (nextX >= 0 && nextX < width && nextY >= 0 && nextY < height) { var nextPiece = pieces[nextX, nextY]; if (nextPiece != null && nextPiece.pieceType == startPiece.pieceType) { matches.Add(nextPiece); } else { break; } } } if (matches.Count >= minPieces) return matches; return null;
}
¿Cómo combinar las cuatro direcciones con GetMatchesByPiece?
La segunda función, GetMatchByPiece, llama cuatro veces a GetMatchByDirection usando vectores distintos para cubrir arriba, abajo, derecha e izquierda [08:30].
Las direcciones se expresan como Vector2:
- Arriba:
(0, 1). - Abajo:
(0, -1). - Derecha:
(1, 0). - Izquierda:
(-1, 0).
Aquí el minPieces que se pasa es 2, no 3. La razón es que una pieza puede tener una coincidencia arriba y otra abajo, sumando tres en total. Si exigieras tres por dirección, perderías ese tipo de match.
¿Qué pasa si una dirección no encuentra matches?
GetMatchByDirectiondevuelvenull. Para evitar errores, inicializas cada variable (upMatch,downMatch,rightMatch,leftMatch) con una lista vacía cuando seanull.
¿Por qué usar Union de System.Linq para fusionar listas?
Una vez tienes las cuatro listas, las combinas con el método Union de LINQ. Esto requiere agregar using System.Linq; al inicio del archivo.
Union tiene una ventaja clave: elimina duplicados automáticamente, así que una pieza que aparezca en varias direcciones solo se contará una vez. Como devuelve un array, le aplicas ToList() al final.
El flujo es:
verticalMatches = upMatch.Union(downMatch).ToList().horizontalMatches = leftMatch.Union(rightMatch).ToList().- Creas
foundMatchescomo lista vacía dePiece.
¿Cómo decidir qué matches agregar al resultado final?
Antes de unir verticales y horizontales al resultado, validas que cada grupo cumpla con el mínimo. Si verticalMatches.Count >= minPieces, los agregas a foundMatches con Union. Lo mismo para horizontalMatches.
Finalmente retornas foundMatches, contenga elementos o esté vacía. Esa lista es la que tu juego usará para eliminar piezas y disparar la siguiente jugada [12:45].
Con estas dos funciones ya tienes el motor de detección listo. ¿En qué parte del flujo del juego planeas llamar GetMatchByPiece, justo después del swap o también al generar el tablero inicial? Cuéntamelo en los comentarios.