Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Dúvida de como fazer a Unity esperar

Boa Noite professor,

Estou mais com uma curiosidade do que uma dúvida, mas como eu faria para a Unity esperar um pouco antes de continuar a função? Por exemplo: Exemplo de esperar na Unity . Vi um pessoal usando o IEnumerator com o WaitForSeconds(), mas não consegui fazer funcionar no meu exemplo. Teria alguma forma mais fácil de fazer isso?

Desde já agradesço a atenção

4 respostas

Oi, Rodrigo, tudo bem?

Acho que a primeira pergunta que eu faria era, por que você quer fazer isso? Com essa resposta a gente pode estudar os casos.

Mas aqui vão alguns:

Você poderia perguntar se a animação terminou com algo como:

// script de animação

void isAnimacaoMorrer() 
{
        this.animator.GetCurrentAnimatorStateInfo(0).IsName("Nome da Animação") && animator.GetCurrentAnimatorStateInfo(0).normalizedTime < 1
}

Com a linha acima você verifica se está na animação X e se ela já terminou, problema disso é que não funcionaria muito bem junto com o método morrer porque você tem que trocar o som entre outras coisas, então esse método não pode ser chamado várias vezes.

Outra coisa que você pode fazer é transformar o Morrer em uma coroutine (se você continuar na série de Unity) você vai aprender sobre isso, com elas você pode pedir pra esperar um tempo que é o caso que você estava testando.

Outra mais comum seria ter um temporizador:

    public float timeRemaining = 10;

    void Morrer()
    {
        if (timeRemaining > 0)
        {
            timeRemaining -= Time.deltaTime;
        else
        {
                // o que você quer fazer aqui
        }
    }

O problema da maioria dessas abordagens é que no nosso caso o Morrer não pode ficar rodando, ele roda e depois pararia. Por isso a pergunta da motivação para ter esse tempo lá do inicio.

Uhmm... entendi, no meu caso eu gostaria que o zumbi terminasse a animação, ficasse caido um tempo no chão e depois fosse para baixo, por isso estava perguntando. Mas realmente não parece que será bom esse tipo de solução no método morrer. Eu já tinha até colocado no assistir mais tarde no youtube um video que explicava Coroutine kkkk não tinha entendido muito bem.

solução!

Blz, se você quiser um jeito mais simples seria, deixar o morrer do jeito que ele tá mas tirar o this.enabled = false;, talvez o Kit Medico e o Destroy.

boolean vivo = true; // no Morrer troque essa variável para false
tempoPosMorte = 8;

void Update
{
    if (!vivo)
    {
        tempoPosMorte -= Time.deltaTime;
        if (tempoPosMorte < 0)
        {
            // faz tudo o que você quer fazer
            // desabilitar a colisão pra ele cair pelo cenário
            // ligar a gravidade tirando o lock do Y no rigidbody, etc
            Destroy(gameObject, 3)
            this.enable = false;
        }
    }  
}

Não sei deu pra entender mas seria, no Morrer faz algumas coisas e torna a boolean de vivo pra false (ela pode ficar em outro lugar se quiser) e depois no Update iria esperar um certo tempo e rodar outros pedaços de código.

O ideal pro seu caso imagino que seja coroutine mas você pode simplificar até estudar um pouco mais.

Se não deu pra entender bem pode me falar que tento explicar de outra forma.

Sim entendi, vou tentar implementar, Obrigado professor!