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.