Unity Spain

Mesa de ayuda => Unity3D => Scripting => Mensaje iniciado por: Noehg91 en Enero 25, 2019, 11:09:54 AM

Título: Repintar un GameObject 2D
Publicado por: Noehg91 en Enero 25, 2019, 11:09:54 AM
Hola,
 
estoy programando unos dados en 2D. Al no querer meter animaciones, lo que he pensado es cambiar varias veces la imagen del dado (es decir, cambiando los números) antes de pararse en el definitivo. Mi código es este:
 

public void throwDices() {
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
while (stopWatch.ElapsedMilliseconds <= 10000) {
   for (int i = 0; i < dices.Length; i++) {
      changeDiceSprite(dices[i], random.Next(0, 6));
   }
   Thread.Sleep(1000);
}      
stopWatch.Stop();
}

 
Por si alguien no conoce la clase Stopwatch, simplemente lo que está haciendo el código es comprobar si han pasado ya 10 segundos y, si todavía no han pasado, cambiar el sprite del dado y esperar un segundo más.
 
La parte lógica funciona bien, pero los dados no se repintan cada vez que se cambia el sprite, sino sólo la última vez. Deduzco que es porque hasta que no finaliza la ejecución del método onClic no se repinta nada... ¿Hay alguna manera de forzarlo?
 
¡Gracias!
Título: Repintar un GameObject 2D
Publicado por: Noehg91 en Enero 28, 2019, 01:37:41 PM
He encontrado la respuesta, así que me respondo a mí misma por si a alguien le sirve.
 
Tal como imaginaba, hasta que no finaliza la ejecución de cada función (rutina), no finaliza el frame. Por tanto lo que hay que hacer es meter la lógica en una corutina. Entiendo que este aprendizaje va a ser muy importante en cualquier desarrollo, pues será algo que se utilice bastante a menudo. Por tanto, el código anterior quedaría así:
 

public void throwDices() {
StartCoroutine(startThrowDices());
}
IEnumerator startThrowDices() {
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
while (stopWatch.ElapsedMilliseconds <= 1500) {
   for (int i = 0; i < dices.Length; i++) {
      changeDiceSprite(dices[i], random.Next(0, 6));
   }
   yield return new WaitForSeconds((float) 0.1);
}      
stopWatch.Stop();
}

 
Por tanto, la función llamada desde el onClic va a invocar a la corutina, que cada vez que cambia un sprite se para durante un segundo (finalizando también un frame) y después continúa.