La interacción del usuario en Unity puede ser directa, clara y multiplataforma. Con OnMouseDown, el mismo código reconoce toques en móvil y clics en PC, permitiendo seleccionar y mover caramelos con el dedo o el ratón. Aquí verás cómo estructurar el flujo, qué variables usar y cómo dar feedback visual sin complicar el código.
¿Cómo detecta Unity toques y clics con OnMouseDown?
Unity traduce automáticamente el mouse a toque en móvil gracias a sus traductores internos. Así, el mismo juego puede adaptarse entre móvil y PC con mínimos cambios. Con el método OnMouseDown, el motor llama al código cuando el usuario toca o hace clic sobre el caramelo.
Puntos clave:
Reutiliza la detección con OnMouseDown para móvil y PC sin duplicar lógica.
Mantén el código legible separando tareas: selectCandy, deselectCandy, OnMouseDown.
Evita mezclar toda la lógica en un solo método; facilita el mantenimiento.
¿Qué estados y variables gobiernan la selección?
Para gestionar qué caramelo está activo y qué hacer ante nuevos toques, se definen estados mínimos pero claros. La encapsulación ayuda a evitar efectos colaterales entre scripts.
En el gestor del tablero, usa una variable privada: selectedCandy. Es mejor que sea privada para que otros scripts no la modifiquen.
No reutilices currentCandy: es público y es un placeholder de inicialización; podría destruirse o necesitarse en otro momento.
En el caramelo, controla el estado con un booleano: isSelected. Cambia entre true/false al seleccionar y desseleccionar.
Usa previousSelected para saber cuál fue el último caramelo seleccionado. Aclara que es un tipo Candy, no un GameObject.
Para el feedback visual, emplea spriteRenderer.color con selectedColor y Color.white.
¿Cómo se ve el feedback visual?
El feedback visual es simple y efectivo: al seleccionar, spriteRenderer.color = selectedColor (tinte gris medio). Al desseleccionar, spriteRenderer.color = Color.white para volver al color original. Resultado: claridad inmediata sobre qué caramelo está activo.
¿Por qué evitar Start y Update aquí?
Si no usas lógica por fotograma, elimina Start y Update. Mantienes el script limpio y más fácil de leer. Menos ruido, misma funcionalidad.
¿Cómo se implementa la lógica de selección y desselección?
La clave es combinar comprobaciones tempranas con una lógica de estados predecible. Primero, evita acciones cuando no toca; luego, decide entre seleccionar o desseleccionar.
Comprobaciones tempranas en OnMouseDown.
Si no hay imagen: spriteRenderer.sprite == null, no haces nada.
Si el tablero está animando: BoardManager.SharedInstance.isShifting, no haces nada.
Si el caramelo ya está seleccionado y lo pulsas, desselecciona.
Si no está seleccionado:
Si no hay ningún anterior seleccionado, selecciona el actual.
Si ya había uno, desselecciona el anterior.
// En BoardManager.csprivateCandy selectedCandy;// Encapsula el caramelo actualmente seleccionado.
// En Candy.cs (fragmentos clave)publicclassCandy:MonoBehaviour{privatebool isSelected =false;// Estado local.privateSpriteRenderer spriteRenderer;// Asignado previamente.publicColor selectedColor;// Tinte gris medio configurado.// Referencia al previamente seleccionado (puede vivir en el BoardManager).// Candy previousSelected;voidOnMouseDown(){// 1) Early return: no imagen o tablero está animando.if(spriteRenderer.sprite ==null|| BoardManager.SharedInstance.isShifting){return;}// 2) Lógica de selección/desselección.if(isSelected){deselectCandy();}else{if(previousSelected ==null){selectCandy();}else{ previousSelected.deselectCandy();// Variante opcional de gameplay:// selectCandy();}}}privatevoidselectCandy(){ isSelected =true; spriteRenderer.color = selectedColor; previousSelected =this;// Garantiza que el "anterior" apunte al actual.}privatevoiddeselectCandy(){ isSelected =false; spriteRenderer.color = Color.white; previousSelected =null;}}
¿Qué hace OnMouseDown paso a paso?
Valida si hay sprite visible o si el tablero está en movimiento. Si se cumple cualquiera, sale con return.
Si el caramelo ya estaba activo, invoca deselectCandy().
Si no estaba activo y no había uno previo, llama a selectCandy().
Si sí había uno previo, llama a previousSelected.deselectCandy().
¿Qué variante de gameplay puedes habilitar?
Puedes permitir que, al tocar un segundo caramelo, se desseleccione el anterior y se seleccione automáticamente el nuevo con una sola línea extra tras desseleccionar. Esto cambia la experiencia de usuario sin reescribir la arquitectura.
Habilidades y conceptos reforzados:
Encapsulación: variables privadas para proteger estados.
Patrón singleton: acceso a BoardManager.SharedInstance.
Métodos atómicos: selectCandy y deselectCandy separados para claridad.
Early return: evita estados inválidos y reduce anidación.
Feedback visual: tintes con SpriteRenderer y colores.
Compatibilidad multiplataforma: OnMouseDown unifica táctil y ratón.
¿Tienes dudas sobre la variante de selección o sobre cómo organizar previousSelected entre scripts? Cuéntalo y revisamos el flujo juntos.