Menu
CoddyTech

Pętle w korutynach

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

Pętla z instrukcją yield return w środku wykonuje się przez wiele klatek, ponieważ każda iteracja zatrzymuje się przed następną. Dzięki WaitForSeconds pętla powtarza coś w równych odstępach. Ta syrena miga 3 razy:

IEnumerator Flash()
{
    for (int i = 0; i < 3; i++)
    {
        lamp.enabled = true;
        yield return new WaitForSeconds(0.2f);
        lamp.enabled = false;
        yield return new WaitForSeconds(0.2f);
    }
}

Dzięki yield return null pętla wykonuje niewielką część pracy w każdej klatce, aż warunek zostanie spełniony — tak właśnie korutyna animuje jakiś element. Ten balon, początkowo w skali 1, powiększa się o 0.5 na sekundę, aż jego skala osiągnie 2, a następnie wyświetla komunikat:

IEnumerator Inflate()
{
    while (transform.localScale.x < 2f)
    {
        transform.localScale += Vector3.one * 0.5f * Time.deltaTime;
        yield return null;
    }
    Debug.Log("Full");
}

Time.deltaTime działa tu tak samo jak w Update(): korutyna wznawia działanie raz na klatkę, a linia po pętli wykona się dopiero po jej zakończeniu. Bez yield cała pętla wykonałaby się w jednej klatce i balon od razu byłby pełny. Pętla while (true) jest w korutynie w porządku, o ile przy każdej iteracji wykonuje instrukcję yield; bez niej nigdy nie oddaje sterowania klatce, a edytor Unity się zawiesza.

challenge icon

Wyzwanie

Łatwy

Napisz Ride, aby krata wykonała pełny cykl.

  1. Ustaw Vector3 up = down + Vector3.up * height;. Gdy while (transform.position != up), przesuwaj ją za pomocą Vector3.MoveTowards(transform.position, up, speed * Time.deltaTime) i użyj yield return null;.
  2. Zapisz w logu Open, a następnie użyj yield return new WaitForSeconds(1f);.
  3. W ten sam sposób opuść ją do down, a następnie zapisz w logu Closed.

Naciśnij „Graj” i naciśnij spację: brama podniesie się, odczeka i zamknie. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

using System.Collections;
using UnityEngine;

public class Portcullis : MonoBehaviour
{
    public float speed = 1.5f;
    public float height = 3f;
    Vector3 down;

    void Start()
    {
        down = transform.position;
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            StartCoroutine(Ride());
        }
    }

    IEnumerator Ride()
    {
        // Podnieś się o height jednostek z prędkością speed i wypisz Open, odczekaj 1 sekundę, wróć na dół i wypisz Closed
        yield return null;
    }
}

Wszystkie lekcje w sekcji Fizyka i rozgrywka

Poćwicz samodzielnie: Edytor online Unity