Tworzę grę platformową 2D, w której jeśli gracz spadnie z podstawy / ziemi, chcę, aby odrodził się w najbliższym punkcie kontrolnym. Chciałbym jednak, aby opóźnienie między spadnięciem gracza z ziemi a odrodzeniem się zakończyło. To jest sekcja mojego kodu, aby osiągnąć ten cel:
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;
}
Działa to dobrze w przypadku niewielkich opóźnień odrodzenia, takich jak 1 lub 2 sekundy. Ale po zwiększeniu opóźnienia do 5 sekund gracz po pojawieniu się w najbliższym punkcie kontrolnym znika w jednej chwili, a następnie po kilku powtórzeniach pojawia się ponownie.
Jest to 2-sekundowe opóźnienie
Jest to 5-sekundowe opóźnienie
Jak mogę to naprawić?
unity
coroutines
Debarun Mukherjee
źródło
źródło
Odpowiedzi:
Wydaje się, że nie ma to nic wspólnego z tym, jak konfigurujesz coroutine. Prawdopodobnie dzieje się tak, że gracz uzyskuje wystarczająco duże przyspieszenie podczas upadku, aby przelecieć obok ziemi i zderzacza. Kiedy przesuniesz pozycję podczas odrodzenia, nadal będzie spadać w tym samym tempie. W swojej metodzie respawn, kiedyś po linii czekaj, ustawić z powrotem do zera prędkości:
GetComponent<Rigidbody2D>().velocity = Vector2.zero
.źródło