O que há de errado com a minha rotina de Respawn?

19

Estou criando um jogo de plataformas 2D no qual, se o jogador cair da base / solo, quero que o jogador reapareça no ponto de verificação mais próximo. No entanto, quero que haja um atraso entre o jogador que cai do chão e o ressurgimento. Esta é a seção do meu código para atingir este objetivo:

private void OnTriggerEnter2D(Collider2D collision)
{
    Debug.Log(collision.tag);
    if (collision.tag.Equals("Kill")) 
    {
        StartCoroutine("Respawn");
    }
    else if(collision.tag.Equals("Checkpoint"))
    {

        Animator flag = collision.GetComponent<Animator>();
        if (!flag.GetBool("hasCrossed"))
        {
            flagCounter++;
            flag.SetBool("hasCrossed", true);
            checkpoint = collision.gameObject.transform.position;
        }
    }
}

IEnumerator Respawn()
{
    yield return new WaitForSeconds(respawnDelay);
    transform.position = checkpoint;

}

Isso funciona bem para pequenos atrasos de reaparecimento, como 1 ou 2 segundos. Mas, ao aumentar o atraso para 5 segundos, o jogador depois de aparecer no ponto de verificação mais próximo desaparece em um instante e, depois de algumas repetições, o jogador reaparece.

Isso ocorre pelo atraso de 2 segundos Isto é para o atraso de 2 segundos

Isso ocorre pelo atraso de 5 segundos Isso ocorre pelo atraso de 5 segundos

Como posso consertar isso?

Debarun Mukherjee
fonte
3
Adoro as imagens animadas!
213 Konerak
1
também conhecido como gifs
user1306322 #

Respostas:

49

Isso não parece ter nada a ver com a forma como você configura a corotina. O que provavelmente está acontecendo é que o jogador recebe uma aceleração alta o suficiente enquanto cai para ultrapassar o solo e o colisor de precipitação. Quando você move a posição durante o reaparecimento, ela ainda estará caindo na mesma taxa. No seu método de Respawn, algum tempo depois de sua linha de espera, definir a volta velocidade para zero: GetComponent<Rigidbody2D>().velocity = Vector2.zero.

tyjkenn
fonte
2
Os bugs nos jogos são impressionantes xD
Tom
11
De um modo mais geral, você deve redefinir o estado do seu personagem, além da posição. Como saúde, MP, munição, etc. Não se esqueça de redefinir os inimigos inimigos também, se for esse tipo de jogo.
catraca aberração
@ Joe, mas e os amigos?
David Starkey
8
Relacionado: A menos que seu jogo seja baseado na física, muitos jogadores de plataforma têm uma "velocidade máxima de queda" para permitir quedas mais controladas (e evitar erros como esse).
desafiar