Menu
CoddyTech

Pętle w korutynach

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

Pętla zawierająca yield return działa przez wiele klatek, ponieważ każde przejście zatrzymuje ją przed następnym. Dzięki WaitForSeconds pętla powtarza coś w określonym rytmie. 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ż jej warunek zostanie spełniony. W ten sposób coroutine animuje jakiś obiekt. Ten balon, którego skala wynosi 1, zwiększa ją o 0.5 na sekundę, aż 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(): coroutine wznawia działanie raz na klatkę, a wiersz po pętli wykonuje 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 coroutine w porządku, o ile przy każdym przejściu wykonuje yield; bez niego nigdy nie oddaje sterowania klatce i edytor Unity zawiesza się.

challenge icon

Wyzwanie

Łatwy

Spacja uruchamia korutynę Ride kraty zamkowej Portcullis. Napisz Ride tak, aby brama wykonała pełny cykl:

  • Unosi się o height (3) jednostki z prędkością speed (1.5) jednostki na sekundę, zatrzymuje się dokładnie na górze i zapisuje Open.
  • Pozostaje otwarta przez 1 sekundę.
  • Opuszcza się z tą samą prędkością do miejsca, w którym się znajdowała na początku (down), i zapisuje Closed.

Naciśnij Play i naciśnij Spację, a następnie Check.

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 zapisz w logu Open, pozostań tam przez 1 sekundę, wróć w dół i zapisz w logu Closed
        yield return null;
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Fizyka i rozgrywka