Jump to content
UnitySpain

Aceptamos donaciones vía Paypal.

UnitySpain.com es un servicio gratuito, pero mantener la Comunidad conlleva una serie de gastos.

Fondo Anual Unityspain: Donados 58,34€ de 150,00€

  • Servidor: Dominio.com y Hosting Web
  • Mantenimiento de los Foros
  • Contenido y Servicios Extras
  • Mantenimiento para Redes Sociales
rogerdv

Determinar si una animacion ha terminado

Recommended Posts

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?

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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.

Utilizando animator.GetCurrentAnimatorStateInfo para comprobar cuando comienza y finaliza una animacion.

En el siguiente script he utilizado una corrutina:

using UnityEngine;
using System.Collections;

public class Test1 : MonoBehaviour {

	Animator animator;

	// Use this for initialization
	void Start () {
	
		this.animator = this.GetComponent<Animator>();

	}
	
	// Update is called once per frame
	void Update () {

		if(Input.GetKeyDown(KeyCode.Space)) StartCoroutine(EventoFinAnimacion(0, "NombreAnimacion", Accion));
	
	}

	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));

	}

 

Edited by kaito

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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.

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

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

×
×
  • Create New...