Was ist los mit meiner Respawn-Coroutine?

19

Ich erstelle ein 2D-Platformer-Spiel, bei dem der Spieler, wenn er von der Basis / vom Boden fällt, am nächsten Kontrollpunkt wieder auftauchen soll. Ich möchte jedoch, dass es eine Verzögerung zwischen dem Spieler, der vom Boden fällt, und dem Respawn gibt. Dies ist der Teil meines Codes, um dieses Ziel zu erreichen:

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;

}

Dies funktioniert gut für kleine Respawn-Verzögerungen wie 1 oder 2 Sekunden. Wenn Sie die Verzögerung auf 5 Sekunden erhöhen, verschwindet der Spieler sofort, nachdem er am nächsten Kontrollpunkt erschienen ist. Nach einigen Wiederholungen erscheint der Spieler wieder.

Dies ist für die Verzögerung von 2 Sekunden Dies ist für die Zeitverzögerung von 2 Sekunden

Dies ist für die Verzögerung von 5 Sekunden Dies ist für die Zeitverzögerung von 5 Sekunden

Wie kann ich das beheben?

Debarun Mukherjee
quelle
3
Ich liebe die animierten Screenshots!
Konerak
1
auch bekannt als Gifs
user1306322

Antworten:

49

Dies scheint nichts damit zu tun zu haben, wie Sie die Coroutine eingerichtet haben. Was wahrscheinlich passiert, ist, dass der Spieler beim Fallen eine Beschleunigung erhält, die hoch genug ist, um über den Boden und den Fallout-Collider zu stoßen. Wenn Sie die Position während des Respawns verschieben, sinkt sie immer noch mit der gleichen Geschwindigkeit. In Ihrer Respawn Methode, irgendwann nach der Wartelinie, stellen Sie die Geschwindigkeit auf Null zurück: GetComponent<Rigidbody2D>().velocity = Vector2.zero.

tyjkenn
quelle
2
Spielfehler sind fantastisch xD
Tom
11
Im Allgemeinen sollten Sie neben der Position so viel Status Ihres Spielercharakters zurücksetzen, wie Sie benötigen. Wie Gesundheit, MP, Munition usw. Vergessen Sie nicht, auch feindliche Gegner zurückzusetzen, wenn es sich um ein solches Spiel handelt.
Ratschenfreak
@ Joe, aber was ist mit Frenemies?
David Starkey
8
Verwandte: Wenn Ihr Spiel nicht auf Physik basiert, haben viele Plattformspieler eine "maximale Fallgeschwindigkeit", um kontrollierte Stürze zu ermöglichen (und solche Bugs zu vermeiden).
trotzen