Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Temas recientes

Repintar un GameObject 2D

Iniciado por Noehg91, Enero 25, 2019, 11:09:54 AM

Tema anterior - Siguiente tema
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!

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.

Etiquetas: