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.
publicclassCandy:MonoBehaviour{publicSpriteRenderer spriteRenderer;// asignado en editor o en Awake.publicint id;// identificador único del caramelo.publicvoidSwapSprite(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.
voidOnMouseDown(){// ... 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.
Esto se debe a que el método Update se llama en cada frame y cómo newPosition != Vector3.zero entonces estará llamando el método en cada frame lo cual puede afectar un poco el performance.
Yo agregue a tu código el siguiente método.
publicvoidSwapId(Candy candy){ int tempId = candy.id; candy.id=this.id;this.id= tempId;}
Este curso esta super genial, y más aún cuando ya haz tomado los 3 cursos anteriores de la Carrera, entiendes casi todo, excepto a veces por la lógica, pero es parte del proceso aprender a leer código y desarrollar la destreza del pensamiento lógico.
Estoy de acuerdo, creo que van a sacar otro curso de Unity con este profe, hasta ahora he aprendido un montón con la carrera.
Una de las mejores carreras que puedes aprender en Platzi. Sinceramente cada curso es mas interesante que el anterior. Y todos te enseñan algo nuevo. Yo me siento muy satisfecha hasta ahora.
Cual es la diferencia entre newCandy.GetComponent<SpriteRenderer>.sprite y newCandy.spriteRenderer.sprite?
En el primero le estas pidiendo a newCandy su componente "sprite renderer" y en el segundo le estas asignando un sprite a newCandy