Detección y Eliminación de Coincidencias en Candy Crush

Clase 17 de 31Curso de Desarrollo de Videojuegos para Móviles con Unity

Contenido del curso

Diseño de Game Play

Retos finales

Resumen

Detectar coincidencias de caramelos puede ser simple y eficiente cuando se entiende la lógica esencial. Aquí verás cómo estructurar el análisis por filas y columnas, definir el mínimo para un match y usar raycast 2D en C# con resultados claros, manteniendo un rendimiento óptimo en móviles al evitar update innecesarios.

¿Cómo detectar matches en candy crush con C# y Unity?

El manager es el encargado de revisar la matriz de datos y decidir si hay vecinos en fila o columna que formen un match de tres o más. Para ello, se escanean direcciones usando una regla básica: el actual y sus vecinos contiguos iguales.

¿Cómo define el manager el mínimo para un match?

Para mantener el código claro, se usa una constante que representa vecinos mínimos del actual. Dos vecinos + el actual = tres en línea.

  • Mejora la legibilidad del conteo de coincidencias.
  • Sigue buenas prácticas de C#: constantes con inicial mayúscula.
  • Representa el número de vecinos, no el total absoluto.
// En BoardManager public const int MinCandiesToMatch = 2; // 2 vecinos + el actual = 3

¿Qué hace el método findmatch con raycast 2D?

La idea es recopilar vecinos iguales en una dirección y en la contraria. Se usa una List<GameObject> para acumular coincidencias y se compara el SpriteRenderer.sprite del vecino con el del caramelo actual.

  • Devuelve los objetos que coinciden con el actual.
  • Usa Physics2D.Raycast desde la posición del caramelo.
  • Repite mientras exista collider y el sprite sea igual.
  • Recalcula el rayo desde el vecino encontrado.
  • Repite en dirección opuesta para cubrir ambos lados.
// En Candy.cs private List<GameObject> FindMatch(Vector2 direction) { var matchingCandies = new List<GameObject>(); // Adelante en la dirección indicada RaycastHit2D hit = Physics2D.Raycast(transform.position, direction); while (hit.collider != null && hit.collider.GetComponent<SpriteRenderer>()?.sprite == GetComponent<SpriteRenderer>()?.sprite) { matchingCandies.Add(hit.collider.gameObject); hit = Physics2D.Raycast(hit.collider.transform.position, direction); } // Hacia la dirección contraria hit = Physics2D.Raycast(transform.position, -direction); while (hit.collider != null && hit.collider.GetComponent<SpriteRenderer>()?.sprite == GetComponent<SpriteRenderer>()?.sprite) { matchingCandies.Add(hit.collider.gameObject); hit = Physics2D.Raycast(hit.collider.transform.position, -direction); } return matchingCandies; }

¿Cómo manejar la dirección contraria sin duplicar código?

  • Reutiliza la misma variable RaycastHit2D ya declarada.
  • Invierte el vector: -direction para el lado opuesto.
  • Inicia el rayo desde transform.position en el sentido opuesto.
  • Vuelve a avanzar desde hit.collider.transform.position manteniendo -direction.
  • Añade cada vecino válido a matchingCandies.

¿Qué estructura usa el board manager para filas y columnas?

El board manager “conoce” todos los caramelos. Recorre filas y columnas de la matriz para verificar si existen vecinos contiguos que formen coincidencias. Con la lista devuelta, se podrá decidir si hay match y preparar la destrucción de los caramelos coincidentes.

// En BoardManager private List<GameObject> FindMatch(Vector2 direction) { var matchingCandies = new List<GameObject>(); // Aquí se coordina la búsqueda por filas o columnas. return matchingCandies; }

¿Por qué evitar update en móviles?

  • El método update corre cada frame.
  • En móviles implicaría consumo constante de batería.
  • Mejor distribuir tareas en métodos específicos y mantener update limpio.

¿Qué variantes puedes crear en el gameplay?

  • Cuatro en cuadrado como condición especial.
  • Coincidencias en diagonal.
  • Cambios así requieren ajustar gran parte del gameplay.

¿Te animas a proponer mejoras o variantes? Deja tus ideas y comparte cómo ampliaste la detección de coincidencias para hacer el juego más divertido.