Zatrzymywanie korutyn
Część sekcji Fizyka i rozgrywka ścieżki Unity w Coddy. Lekcja 25 z 63.
StartCoroutine zwraca obiekt Coroutine, czyli uchwyt do uruchomionej korutyny. Zapisz go w polu, a StopCoroutine(handle) zatrzyma tę korutynę w miejscu, w którym została wstrzymana: linie po jej yield nigdy się nie wykonają. StopAllCoroutines() zatrzymuje wszystkie korutyny uruchomione przez skrypt. Spacja włącza i wyłącza ten alarm:
Coroutine beeping;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
if (beeping == null)
{
beeping = StartCoroutine(Beep());
}
else
{
StopCoroutine(beeping);
beeping = null;
}
}
}
IEnumerator Beep()
{
while (true)
{
Debug.Log("Beep");
yield return new WaitForSeconds(1f);
}
}Wartość pola nie jest zerowana, gdy korutyna się zatrzymuje, więc alarm ustawia ją z powrotem na null i przy następnym naciśnięciu spacji wiadomo, że nic nie działa. Dwa sposoby, które wydają się poprawne, nie działają. StopCoroutine(Beep()) ponownie wywołuje Beep(), co tworzy nową, jeszcze nierozpoczętą korutynę, a następnie ją zatrzymuje, więc alarm nadal pika. Z kolei enabled = false wyłącza Update() skryptu, ale jego korutyny działają dalej. Korutyna kończy się, gdy zostanie zatrzymana za pomocą jej uchwytu lub przez StopAllCoroutines(), gdy dotrze do ostatniej linii albo gdy jej GameObject zostanie dezaktywowany za pomocą SetActive(false) lub zniszczony.
Wyzwanie
ŁatwySpacja zapala lont Bomb: współprogram Fuse zapisuje w logu Fuse lit, czeka fuseTime (3) sekundy, zapisuje w logu Boom i niszczy bombę. Kliknięcie ma ją rozbroić, ale wyłącza skrypt, a bomba i tak wybucha. Napraw rozbrajanie:
- Kliknięcie podczas palenia się lontu zatrzymuje go i zapisuje w logu
Defused. Bomba pozostaje. - Potem Spacja może ponownie zapalić lont i tym razem, jeśli nie klikniesz, bomba wybuchnie 3 sekundy później.
Naciśnij Play, zapal lont, kliknij i obserwuj konsolę, a następnie naciśnij Check.
Spróbuj swoich sił
using System.Collections;
using UnityEngine;
public class Bomb : MonoBehaviour
{
public float fuseTime = 3f;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
StartCoroutine(Fuse());
}
if (Input.GetMouseButtonDown(0))
{
enabled = false;
Debug.Log("Defused");
}
}
IEnumerator Fuse()
{
Debug.Log("Fuse lit");
yield return new WaitForSeconds(fuseTime);
Debug.Log("Boom");
Destroy(gameObject);
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Fizyka i rozgrywka
1Ciało sztywne
Grawitacja i masaPopychanie za pomocą AddForceSkok z impulsemFixedUpdate dla fizykiPrędkośćCiała kinematycznePowtórka: platforma startowa4Korutyny
WywoływanieInvokeRepeating i CancelInvokeTwoja pierwsza korutynaPętle w korutynachZatrzymywanie korutynPodsumowanie: odliczanie2Kolizje
OnCollisionEnterW co uderzyłem?Rozbijanie przy zderzeniuStanie na podłożuOdbicie i tarcieKształty colliderówPodsumowanie: Zniszczalny mur