OnMouseDown para seleccionar caramelos

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

Resumen

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.cs private Candy selectedCandy; // Encapsula el caramelo actualmente seleccionado.
// En Candy.cs (fragmentos clave) public class Candy : MonoBehaviour { private bool isSelected = false; // Estado local. private SpriteRenderer spriteRenderer; // Asignado previamente. public Color selectedColor; // Tinte gris medio configurado. // Referencia al previamente seleccionado (puede vivir en el BoardManager). // Candy previousSelected; void OnMouseDown() { // 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(); } } } private void selectCandy() { isSelected = true; spriteRenderer.color = selectedColor; previousSelected = this; // Garantiza que el "anterior" apunte al actual. } private void deselectCandy() { 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.