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(): 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#.

      Script base de Candy en Unity C#