Noticias

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

Determinar si una animacion ha terminado

Iniciado por rogerdv, Abril 18, 2016, 08:54:08 PM

Tema anterior - Siguiente tema
He estado investigando al respecto, porque necesito que al terminar una animación, el personaje vuelva a la animación anterior. Una opción que vi es los animation events. No me resultaron muy claros (la documentación parece escasa) y quisiera saber si hay otra variante que implique más código y menos clicks. Alguien me puede orientar al respecto?

http://dsgp.blogspot.com">Divagaciones sobre programación y juegos





es faci solo tienes que hacer referencia a la animacion con un GetComponent<Animation>() y creo que hay una function que se llama isPlaying, si esta en false, es poerque ya termino o no ha empezado

Animation ya es obsoleto, y el componente Animator no trae isPlaying(). Parece que la solucion obligatoria es usar animation events, pero no logro enocntrar cómo hacerlo de forma genérica y no asociado a un GameObject específico.

http://dsgp.blogspot.com">Divagaciones sobre programación y juegos



Abril 21, 2016, 09:59:18 PM #5 Ultima modificación: Abril 21, 2016, 10:05:48 PM por kaito
[quote author=rogerdv" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="35679" data-ipsquote-contentcommentid="129995">Animation ya es obsoleto, y el componente Animator no trae isPlaying(). Parece que la solucion obligatoria es usar animation events, pero no logro enocntrar cómo hacerlo de forma genérica y no asociado a un GameObject específico.[/quote]Utilizando animator.GetCurrentAnimatorStateInfo para comprobar cuando comienza y finaliza una animacion.En el siguiente script he utilizado una corrutina:

}

void Accion(){

   Debug.Log("Animacion NombreAnimacion finalizada");

}

IEnumerator EventoFinAnimacion(int layerAnimacion, string nombreAnimacion, System.Action accion){

   while(!this.animator.GetCurrentAnimatorStateInfo(layerAnimacion).IsName(nombreAnimacion)) yield return null;
   while( this.animator.GetCurrentAnimatorStateInfo(layerAnimacion).IsName(nombreAnimacion)) yield return null;
   accion();

}

}
 Puedes hacerlo infinito haciendo una llamada a la corrutina al final de la misma:
   //Bucle Infinito
IEnumerator EventoFinAnimacion(int layerAnimacion, string nombreAnimacion, System.Action accion){

   while(!this.animator.GetCurrentAnimatorStateInfo(layerAnimacion).IsName(nombreAnimacion)) yield return null;
   while( this.animator.GetCurrentAnimatorStateInfo(layerAnimacion).IsName(nombreAnimacion)) yield return null;
   accion();
   StartCoroutine(EventoFinAnimacion(layerAnimacion, nombreAnimacion, accion));

}
 

Bastante cercano, pero esto no detecta el fin de la animación, a menos que dispare una transición. Y lo que necesito es saber si ha terminado para ejecutar la transición al estado previo.

http://dsgp.blogspot.com">Divagaciones sobre programación y juegos



[quote author=rogerdv date=1461605285" data-ipsquote="" data-cite="rogerdv" class="ipsQuote">Bastante cercano, pero esto no detecta el fin de la animación, a menos que dispare una transición. Y lo que necesito es saber si ha terminado para ejecutar la transición al estado previo.[/quote]Puedes hacer algo rudo con scripting puro:
  1. Creas un booleano llamado, por ejemplo, "animStarted", y un método llamado, por ejemplo, animFinished().
  2. Al iniciar la animación, "animStarted" toma el valor de true.
  3. En el método Update, si animStarted es true...
    1. Si animacion.isPlaying es false, se llama al método animFinished() y animStarted toma el valor de false.
Algo así debería ser. Espero que te ayude!PD: Ahora miro el tema de los eventos con animaciones, que lo utilicé hace tiempo y no me acuerdo muy bien como funcionaban :P

He resuelto de una forma un poco burda con un trigger, para disparar la animación de ataque, y una transición sin condiciones que regresa al estado anterior. Lo cual no me resuelve el problemaque aún no sé cuándo la animación ha terminado y no puedo calcular correctamente si puedo ejecutar una acción a continuación.

http://dsgp.blogspot.com">Divagaciones sobre programación y juegos



Etiquetas: