OnMouseDown para seleccionar caramelos

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

Contenido del curso

Diseño de Game Play

Retos finales

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.