Script base de Candy en Unity C#

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

Resumen

Programar un match 3 en Unity con C# exige una base sólida: definir las variables clave, entender el ciclo de vida de MonoBehaviour y preparar la interacción entre caramelos. Aquí se sientan los cimientos del objeto Candy: color de selección, referencia al anterior seleccionado, componente gráfica, estado de selección, direcciones adyacentes y un identificador único. Todo listo para avanzar con confianza.

¿Qué se define en el script Candy para Unity?

En el esqueleto del script ya están los métodos Start y Update de MonoBehaviour. A partir de ahí, se añaden las variables que sostendrán la lógica del gameplay. Se trabaja en Visual Studio, que autocompleta y accede a librerías, facilitando el flujo de trabajo.

  • Color de selección compartido para resaltar un caramelo activo.
  • Referencia al caramelo anterior para evaluar intercambios.
  • Componente gráfica con SpriteRenderer para tintado y visual.
  • Estado booleano para saber si está seleccionado.
  • Direcciones adyacentes para conectividad cuatro: arriba, abajo, izquierda, derecha.
  • Identificador público para distinguir instancias del mismo asset.

¿Cómo organizar las variables en C# para Candy?

using UnityEngine; public class Candy : MonoBehaviour { // Color de selección compartido por todos los caramelos. private static Color selectedColor = new Color(0.5f, 0.5f, 0.5f, 1.0f); // Referencia al caramelo previamente seleccionado. private static Candy previousSelected = null; // Componente visual del caramelo. private SpriteRenderer spriteRenderer; // Estado de selección del caramelo. private bool isSelected = false; // Direcciones adyacentes (conectividad cuatro). private Vector2[] adjacentDirections = new Vector2[] { Vector2.up, Vector2.down, Vector2.left, Vector2.right }; // Identificador público para distinguir instancias. public int id; private void Awake() { spriteRenderer = GetComponent<SpriteRenderer>(); } }

¿Qué rol cumplen selected color y previous selected como static?

  • static indica una sola instancia compartida por todos los caramelos.
  • El color de selección es común: todos usan el mismo tinte al seleccionarse.
  • La referencia al caramelo previo permite comparar el actual con el anterior para el intercambio y comprobar si hay tres en raya.

¿Por qué usar un identificador público int id?

  • El aspecto visual no basta: puede haber caramelos iguales en distintas celdas.
  • Un id público permite distinguir instancias del mismo asset en el tablero.
  • Es una práctica habitual: usuarios, partidas y assets suelen tener identificador.

¿Cómo inicializar la componente gráfica con awake y getcomponent?

Primero se ejecuta Awake y luego Start: por eso la inicialización de la componente se hace en Awake. Se usa GetComponent para obtener el SpriteRenderer local y poder aplicar colores. Además, el estado de selección parte en falso para evitar confusiones iniciales.

  • Awake antes de Start: asegura que la componente esté lista al iniciar.
  • GetComponent<SpriteRenderer>(): acceso directo a la parte visual del caramelo.
  • Tintado con selectedColor: gris medio (0.5f, 0.5f, 0.5f, 1.0f) para marcar selección.
  • isSelected = false al crear el caramelo.

Ejemplo de inicialización en Awake:

private void Awake() { spriteRenderer = GetComponent<SpriteRenderer>(); }

¿Cómo manejar la conectividad cuatro con Vector2 y enumerados?

En un match 3 tipo Candy Crush, el movimiento es en conectividad cuatro. Se preparan las direcciones con un array de Vector2 usando valores predefinidos que actúan como “enumerados” prácticos: arriba, abajo, izquierda, derecha. Esto permitirá, más adelante, lanzar un rayo en cada dirección para localizar vecinos.

¿Cómo quedan las direcciones adyacentes en el array?

private Vector2[] adjacentDirections = new Vector2[] { Vector2.up, // (0, 1) Vector2.down, // (0, -1) Vector2.left, // (-1, 0) Vector2.right // (1, 0) };

¿Para qué servirá este arreglo en la lógica de intercambio?

  • Localizar el vecino en cada dirección de forma ágil.
  • Comprobar si el intercambio de dos caramelos produce un tres en raya.
  • Evitar cálculos repetitivos al tener las direcciones preparadas.

¿Añadirías alguna variable más para tu propio gameplay o una variante de reglas? Comparte tu enfoque y cuéntanos cómo lo implementarías en Unity con C#.