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 Verzögerung von 5 Sekunden
Wie kann ich das beheben?
unity
coroutines
Debarun Mukherjee
quelle
quelle
Antworten:
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
.quelle