¿Qué hay de malo con mi rutina de reaparición?

19

Estoy creando un juego de Plataformas 2D en el que si el jugador se cae de la base / suelo, quiero que el jugador reaparezca en el punto de control más cercano. Sin embargo, quiero que haya un retraso entre la caída del jugador y la reaparición. Esta es la sección de mi código para lograr 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;

}

Esto funciona bien para pequeños retrasos de reaparición como 1 o 2 segundos. Pero al aumentar el retraso a 5 segundos, el jugador después de aparecer en el punto de control más cercano desaparece en un instante y luego, después de varias repeticiones, el jugador vuelve a aparecer.

Esto es por el retraso de 2 segundos Esto es para el retraso de 2 segundos

Esto es por el retraso de 5 segundos Esto es para el retraso de 5 segundos

¿Cómo puedo arreglar esto?

Debarun Mukherjee
fuente
3
Me encantan las capturas de pantalla animadas!
Konerak
1
también conocidos como gifs
user1306322

Respuestas:

49

Esto no parece tener nada que ver con la forma en que configura la rutina. Lo que probablemente esté sucediendo es que el jugador obtiene una aceleración lo suficientemente alta mientras cae para fallar más allá del suelo y el colisionador de consecuencias. Cuando mueves la posición durante la reaparición, seguirá cayendo a la misma velocidad. En el método de Respawn, algún tiempo después de su línea de espera, ajuste la parte de atrás de velocidad a cero: GetComponent<Rigidbody2D>().velocity = Vector2.zero.

tyjkenn
fuente
2
Los errores de juego son increíbles xD
Tom
11
En términos más generales, debe restablecer todo el estado de su personaje jugador que necesite además de la posición. Como salud, MP, munición, etc. No olvides reiniciar a los enemigos enemigos también si es ese tipo de juego.
Ratchet Freak
@ Joe, pero ¿qué pasa con los frenemies?
David Starkey
8
Relacionado: a menos que su juego esté basado en la física, muchos juegos de plataformas tienen una "velocidad de caída máxima" para permitir caídas más controladas (y evitar errores como este).
desafía