En este momento estás viendo ¿Cómo puedo esperar a que termine la animación y dejar que el código continúe?

 – Unity

¿Cómo puedo esperar a que termine la animación y dejar que el código continúe? – Unity

¿Cómo puedo esperar a que termine la animación y dejar que el código continúe?

– UnityAssets3Free

buenas , soy josel luis y aqui os traigo
nueva pregunta

Estoy tratando de hacer que un enemigo ataque al jugador y que el enemigo ataque a través de la animación, pero el método que tengo para evitar que la animación comience cuando otros están activos no funciona. El problema es que el método que tengo no funciona. Para ser más específicos, básicamente no hace nada como un comentario. Si hay algún código que necesita, debería poder proporcionárselo.

Aquí está el código:

IEnumerator PlayAnim(Animator anim, string booleanName) 
    
        anim.SetBool(booleanName, true);
        yield return new WaitForSeconds(anim.GetCurrentAnimatorStateInfo(0).length + anim.GetCurrentAnimatorStateInfo(0).normalizedTime); // I checked and got a value for that number so it should be paused
        anim.SetBool(booleanName, false);
        
    

En el código anterior, puse una depuración al principio y al final y cuando ejecuté el código, se ejecutaron en el mismo segundo, así que sé que no funciona.

Así es como se llama:

public void AttackPlayer(GameObject playerPos, Animator anim, NavMeshAgent agent, GameObject self, bool MultiAttack, float inRange, float inView, float AttackRange, bool isBlocking, bool HasSeenPLayer)
           

        if (MultiAttack)
                              
            MultAttack(playerPos, anim, agent, self, inRange, inView);                    
        
        else
        
            anim.SetBool("Attack2", false);
            anim.SetBool("Attack3", false);
            StartCoroutine(PlayAnim(anim, "Attack"));
        
        
        if (!PlayerPos.FindPlayerPos(AttackRange, playerPos.transform, inView, self, HasSeenPLayer))
        
            anim.SetBool("Attack", false);
            anim.SetBool("Attack2", false);
            anim.SetBool("Attack3", false);
            state = State.Chase;
        
    

    public void MultAttack(GameObject playerPos, Animator anim, NavMeshAgent agent, GameObject self, float inRange, float inView)
    
        
        if (random == 0) random = Random.Range(1, 5);

        if (random == 1)
                    
            StartCoroutine(PlayAnim(anim, "Attack"));
            random = 0;
            
            return;
        

        if (random == 2)
        
            if (HasParameter("Attack2", anim))
                            
                StartCoroutine(PlayAnim(anim, "Attack2"));
                random = 0;
                
                return;
            
            
            StartCoroutine(PlayAnim(anim, "Attack"));
            random = 0;
            
            return;
        

        if (random == 3)
                    
            if (alk != null)
                              
                alk.particle.gameObject.SetActive(true);
                alk.particle.Play();                
            
                        
            StartCoroutine(AlkAnim(anim, "Attack3"));
            random = 0;
            
            return;
        

        if (random == 4)
                    
            BlockPlayer(playerPos, anim, agent, inRange, inView, self);
            random = 0;
            
            return;
        

        
        StartCoroutine(PlayAnim(anim, "Attack"));
        random = 0;
        
        return;

    

    IEnumerator AlkAnim(Animator anim, string booleanName)
    
        anim.SetBool(booleanName, true);
        yield return new WaitForSeconds(anim.GetCurrentAnimatorStateInfo(0).length + anim.GetCurrentAnimatorStateInfo(0).normalizedTime);
        anim.SetBool(booleanName, false);
        if (alk != null)
        
            alk.particle.Stop();
            alk.particle.gameObject.SetActive(false);
            random = 0;
        
    

    public static bool HasParameter(string paramName, Animator animator)
    
        foreach (AnimatorControllerParameter param in animator.parameters)
        
            if (param.name == paramName)
                return true;
        
        return false;
        

void Start()

    StartCoroutine(GetGood());


 IEnumerator GetGood()
            
        TtF.ChoseChasingWhatStateToAttackPlayer(agent, Player_pos.player, self, anim, MultiAttack, inRange, inView, AttackRange, isBlocking, hasSeenPlayer);
        
        yield return new WaitForSeconds(0.5f); 
        StartCoroutine(GetGood());
    

1 respuesta 1

Creo que su primer enfoque teóricamente funcionaría. El único «problema» es que incluso si ya ha establecido la bandera en el componente animador, el animador es una de las últimas cosas que se ejecutan dentro de un marco (ver Orden de ejecución del evento). Así que creo que tendrías que darle tiempo para cambiar realmente el estado.

Podría, por ejemplo, intentar primero usar un yield return new WaitForEndOfFrame (); antes de comenzar a esperar la duración del estado actual.

Otro enfoque podría ser Eventos de animador. Puede poner este evento al final de su animación y simplemente dejar que llame a un método dedicado.

nota: si aun no se resuelve tu pregunta por favor dejar un comentario y pronto lo podremos de nuevo , muchas gracias

eso es todo,espero que te funcione

Deja una respuesta