Menu
CoddyTech

Twoja pierwsza korutyna

Część sekcji Fizyka i rozgrywka ścieżki Unity w Coddy. Lekcja 24 z 71.

Update() musi kończyć działanie w każdej klatce, więc nie może czekać. Korutyna może: to metoda, która się wstrzymuje, a później wznawia działanie od miejsca, w którym się zatrzymała. Zwraca IEnumerator, do którego potrzebne jest using System.Collections;, a każde yield return w niej oznacza przerwę. W języku C# yield return sprawia, że metoda przekazuje swoje wartości po jednej; Unity prosi o następną, gdy upłynie czas oczekiwania. yield return null czeka jedną klatkę, a yield return new WaitForSeconds(3f) czeka 3 sekundy.

StartCoroutine(Cycle()) uruchamia korutynę. To światło drogowe zapala się na zielono, po 3 sekundach na żółto, a po kolejnej sekundzie na czerwono:

using System.Collections;
using UnityEngine;

public class TrafficLight : MonoBehaviour
{
    Renderer lamp;

    void Start()
    {
        lamp = GetComponent<Renderer>();
        StartCoroutine(Cycle());
    }

    IEnumerator Cycle()
    {
        lamp.material.color = Color.green;
        yield return new WaitForSeconds(3f);
        lamp.material.color = Color.yellow;
        yield return new WaitForSeconds(1f);
        lamp.material.color = Color.red;
    }
}

StartCoroutine od razu uruchamia korutynę do pierwszego yield, a potem Start() kontynuuje działanie; Unity wznawia korutynę po każdym oczekiwaniu, zachowując wartości jej zmiennych lokalnych. Samo Cycle(); bez StartCoroutine nic nie robi: tworzy wstrzymaną metodę i ją porzuca, więc nie wykonuje się ani jedna linijka jej kodu. A yield return 3f; nie oznacza oczekiwania 3 sekund: Unity rozpoznaje tylko obiekty oczekiwania, takie jak WaitForSeconds, a każdą inną wartość traktuje jako jedną klatkę.

challenge icon

Wyzwanie

Łatwy

Spraw, by naciśnięcie spacji uruchamiało pułapkę z kolcami za pomocą korutyny.

  1. Napisz IEnumerator Spring(): zapisz w logu Click, yield return new WaitForSeconds(0.5f);, a następnie transform.position += Vector3.up;.
  2. Następnie odczekaj w ten sam sposób 2 sekundy i ponownie odejmij Vector3.up.
  3. W instrukcji if dla spacji uruchom ją za pomocą StartCoroutine(Spring());.

Naciśnij „Graj” i spację: kolce podskoczą, a potem opadną. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

using System.Collections;
using UnityEngine;

public class SpikeTrap : MonoBehaviour
{
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // Uruchom pułapkę za pomocą korutyny
        }
    }

    // IEnumerator Spring(): Kliknij, odczekaj 0.5 s, przesuń w górę o 1 jednostkę, odczekaj 2 s, przesuń w dół o 1 jednostkę
}

Wszystkie lekcje w sekcji Fizyka i rozgrywka

Poćwicz samodzielnie: Edytor online Unity