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?
usingUnityEngine;publicclassCandy:MonoBehaviour{// Color de selección compartido por todos los caramelos.privatestaticColor selectedColor =newColor(0.5f,0.5f,0.5f,1.0f);// Referencia al caramelo previamente seleccionado.privatestaticCandy previousSelected =null;// Componente visual del caramelo.privateSpriteRenderer spriteRenderer;// Estado de selección del caramelo.privatebool isSelected =false;// Direcciones adyacentes (conectividad cuatro).privateVector2[] adjacentDirections =newVector2[]{ Vector2.up, Vector2.down, Vector2.left, Vector2.right
};// Identificador público para distinguir instancias.publicint id;privatevoidAwake(){ 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.
¿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?
¿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#.
using System.Collections;using System.Collections.Generic;using UnityEngine;publicclassCandy:MonoBehaviour{privatestaticColor selectedColor =newColor(0.5f,0.5f,0.5f,1.0f);privatestaticCandy previousSelected =null;privateSpriteRenderer spriteRenderer;private bool isSelected =false;public int id;privateVector2[] adjacentDirections =newVector2[]{Vector2.up,Vector2.down,Vector2.left,Vector2.right};privatevoidAwake(){ spriteRenderer =GetComponent<SpriteRenderer>();}// Start is called before the first frame updatevoidStart(){}// Update is called once per framevoidUpdate(){}}```
Me parece llamativo que las variables static, compartidas, selectedColor y previousSelected se ubiquen en el script Candy. ¿Se podrían poner en un GameManager?
Luego el array adjacentDirections de vectores dirección me parece muy interesante, para saber qué Candy hay alrededor del actual.
En otro tipo de programas es buena práctica que los atributos de una clase sean privados, y se acceda a ellos desde funciones get y set, ¿Aquí no se hace lo mismo? Mi pregunta está más enfocada al tema de buenas prácticas y no tanto a si es posible o no.
¿En qué ocasiones inicializamos en start, awake, o fuera de cualquier función como el caso isSelected por ejemplo. Tengo entendido que en algunos casos no hay mayor diferencia pero ¿qué opción sería la más "limpia" o más recomendable?
Hasta donde se los modificadores de acceso los utilizamos cuando queremos (en caso de atributos) hacer que la variable la podamos cambiar muy a menudo o arrrastrarla desde la interfaz
(tambien podriamos hacer que la variable en caso de que no queramos que se arrastre desde la interfaz, ponerla en un awake o start para que con un Getcomponent<component>() para que se seleccione sola...aunque tengo entendido [por otros cursos] podriamos omitir esto por performance...aunque tengo mis ideas sobre esto jajaja)
En la segunda, el start se utiliza al principio de cada scene (cambiamos la scene >> se ejecuta al principio (y una sola vez) )
El awake se ejecuta un poco antes del start, tengo entendido que es para inicializar unas cuantas variables
El update se ejecuta cada frame, y el FixedUpdate se ejecuta cada ciertos frames
Las funciones fuera de estos, se ejecutan en ciertas circunstancias... (Solo tengo practica con algunas)
Las más comunes a mi parecer que se llaman si escibirlas dentro del update y los otros son las que tienen que ver con colliders y collision
OnCollissionEnter por ejemplo se llama cada vez que el objeto collisiona con <aqui dejar la condicion>.
Aun no tengo practica con IsSelected pero en la documentación vi que no es muy complicada
buenos días tengo problemas en 2 de las lineas de mi programacion que en este video corresponde a la linea 7 y la 11 las palabras "color" y "spriterenderer" no tienen el color azul (definidas como class) sino negro como si fuera texto normal... estoy trabajando en window 10 y con visual studio 2019
Profee tengo dos problemas el primero es sobre Visual cada vez que abro un script se me abren dos ventanas de visual, en una puedo trabajar pero la otra se bloquea y no hay forma de cerrarla me muestra el siguiente error: https://ibb.co/9n3149G (link para ver la screenshot)
El segundo es que visual no me reconoce algunos comandos como el de vector2, o de spriterenderer se quedan en color negro y luego la consola me tira error aqui dejo la captura: https://ibb.co/27vbVVF
😦