Swap de caramelos sin mover GameObject

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

Resumen

Domina un flujo de juego sólido en Unity: aprende a intercambiar caramelos con un método de swap de sprites ágil, sin mover el GameObject y manteniendo coherentes los datos del identificador (id). Verás cómo una estructura clara con if, else y return permite un código simple y mantenible, ideal para iterar rápido en editor y probar en móvil al final.

¿Qué problema resuelve el swap de sprites en Unity?

Intercambiar solo la imagen del caramelo (el sprite) evita desplazar el GameObject, lo que hace el código más ágil y cómodo en teléfonos móviles. Esta primera iteración permite cambiar cualquier par de caramelos en pantalla; más adelante se limitará a vecinos (arriba, abajo, izquierda, derecha).

¿Por qué no mover el GameObject en móvil?

  • Menos coste: solo cambia el sprite, no la transformación del objeto.
  • Código simple: se evita lógica de posicionamiento.
  • Flujo claro: se controla todo desde el Sprite Renderer.

¿Cuándo evitar el intercambio por igualdad de sprite?

  • Si ambos caramelos tienen la misma imagen, no se percibe cambio.
  • Se corta con return para cancelar el movimiento innecesario.
  • Evita afectar el conteo de movimientos por una acción vacía.

¿Cómo implementar el método swap sprite paso a paso?

Se añade un método público en el script del caramelo para usarlo desde el manager. La lógica: comprobar igualdad de sprite, usar un auxiliar para la copia, hacer el swap visual y luego intercambiar también el id.

public class Candy : MonoBehaviour
{
    public SpriteRenderer spriteRenderer; // asignado en editor o en Awake.
    public int id; // identificador único del caramelo.

    public void SwapSprite(Candy newCandy)
    {
        // 1) Si tienen el mismo sprite: no hacer nada.
        if (spriteRenderer.sprite == newCandy.GetComponent<SpriteRenderer>().sprite)
        {
            return;
        }

        // 2) Copia temporal (auxiliar) del sprite del nuevo caramelo.
        Sprite oldSprite = newCandy.GetComponent<SpriteRenderer>().sprite;

        // 3) El nuevo caramelo toma el sprite del actual.
        newCandy.GetComponent<SpriteRenderer>().sprite = this.spriteRenderer.sprite;

        // 4) El actual toma el sprite de la copia temporal.
        this.spriteRenderer.sprite = oldSprite;

        // 5) Intercambio del identificador (id) con copia temporal.
        int tempId = newCandy.id;
        newCandy.id = this.id;
        this.id = tempId;
    }
}

¿Cómo se hace la copia temporal auxiliar?

  • Usar una variable local como copia de seguridad.
  • Guardar el sprite del otro caramelo antes de sobrescribir.
  • Asegurar el intercambio en ambos sentidos sin perder datos.

¿Cómo intercambiar el identificador id junto con el sprite?

  • Crear tempId para el valor original.
  • Asignar newCandy.id = this.id.
  • Finalizar con this.id = tempId.
  • Mantener coherencia entre imagen y datos del caramelo.

¿Dónde integrar la llamada en el flujo de interacción?

La invocación a SwapSprite debe hacerse en el manejo del clic, dentro de mouse down. No se llama si no hay sprite o si se hace clic en el mismo caramelo para deseleccionar. Se ejecuta en el else donde ya existe un caramelo previamente seleccionado (previous selected), justo antes de deseleccionar.

void OnMouseDown()
{
    // ... lógica previa de selección/deselección.

    // Caso: hay un caramelo previamente seleccionado y se hace clic en otro.
    // Antes de deseleccionar, intercambiar el actual con el anterior.
    if (/* else donde procede el intercambio */)
    {
        this.SwapSprite(previousSelected);
        // Luego, deseleccionar los involucrados según tu flujo actual.
    }
}

¿Qué casos cubre el control con if, else y return?

  • Sin sprite: no se intenta el intercambio.
  • Clic en el mismo seleccionado: solo deselección.
  • Sprites iguales: return y no se cambia nada.
  • Dos diferentes: swap visual y swap de id.

¿Qué alcance tiene esta primera iteración del gameplay?

  • Se pueden intercambiar caramelos en cualquier lugar del tablero.
  • No se permite intercambiar un objeto consigo mismo.
  • Ya es posible crear tres en raya manualmente con los assets.
  • Próximo paso: restringir a vecinos si el movimiento es válido.

¿Te quedó alguna duda sobre el flujo con if/else, el uso del auxiliar o la ubicación de la llamada en mouse down? Deja tu pregunta y seguimos mejorándolo juntos.