Unity3D: Wie kann ich dieses Problem beim Respawn verzögern?
Hallo,
ich habe mich jetzt einmal ein wenig mit Unity beschäftigt und auch schon ein kleines Spiel "gebaut". Leider habe ich ein Problem. Es ist nämlich so, dass es mir nicht so gut gefällt, wenn der Spieler sofort respawned, wenn er stirbt. Deshalb habe ich einmal nachgeschaut, wie man eine Verzögerung einbaut und bin auch fündig geworden. Leider finde ich keine Lösung, um dieses Problem zu umgehen. Der Code sieht wie folgt aus:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class KillPlayer : MonoBehaviour
{
[SerializeField]
Transform spawnPoint;
public float RespawnDelay;
public void OnCollisionEnter2D(Collision2D col)
{
if (col.transform.CompareTag("Player"))
{
Respawn();
col.transform.position = spawnPoint.position;
ScoreScript.ScoreValue++;
}
}
public void Respawn()
{
StartCoroutine("WaitCoroutine");
}
IEnumerator WaitCoroutine()
{
yield return new WaitForSeconds(RespawnDelay);
}
}
Es fällt natürlich auf, dass die Zeile
col.transform.position = spawnPoint.position;
in die WaitCoroutine-Klasse muss. Nur wenn ich das mache, wird herumgemeckert (zu Recht), dass col im aktuellen Kontext nicht vorhanden ist. Wie kann ich diesen Fehler umgehen?
Danke an alle hilfreichen Antworten!
2 Antworten
Das dürfte daran liegen, weil dein Code einfach weiterläuft, nachdem die Coroutine gestartet wurde. Daher respawned der Spieler sofort, egal wie lange die Coroutine läuft. Du hast möglicherweise noch nicht ganz verstanden, wie Coroutinen funktionieren, schau dir das nochmal in Ruhe an.
Das müsste dann in diese Richtung gehen:
public void OnCollisionEnter2D(Collision2D col)
{
if (col.transform.CompareTag("Player"))
{
StartCoroutine("RespawnCoroutine");
col.transform.position = spawnPoint.position;
ScoreScript.ScoreValue++;
}
}
public void Respawn()
{
//Aktionen, die beim Respawn passieren sollen
}
IEnumerator RespawnCoroutine()
{
// Aktionen, direkt nachdem der Spieler gestorben ist
yield return new WaitForSeconds(RespawnDelay);
Respawn();
}
}
Was das mit dem Setzen der Position sein soll, verstehe ich nicht.
Du musst dich jetzt noch um einige andere Dinge kümmern, wie zum Beispiel, was mit dem Objekt des Spielers passiert, während der tot ist und auf den Respawn wartet.
Ich denke eher, dass es daran liegt, dass die Respanwnzeit 0 ist.
Wie wäre es mit:
public float RespawnDelay = 2;
^,^