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.
Wyzwanie
ŁatwyNapisz Ride, aby krata wykonała pełny cykl.
- Ustaw
Vector3 up = down + Vector3.up * height;. Gdywhile (transform.position != up), przesuwaj ją za pomocąVector3.MoveTowards(transform.position, up, speed * Time.deltaTime)i użyjyield return null;. - Zapisz w logu
Open, a następnie użyjyield return new WaitForSeconds(1f);. - W ten sam sposób opuść ją do
down, a następnie zapisz w loguClosed.
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
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: odliczanie10Projekt: Ucieczka z areny
ArenaŁowcy2Kolizje
OnCollisionEnterW co uderzyłem?Rozbijanie przy zderzeniuStanie na podłożuOdbicie i tarcieKształty colliderówPodsumowanie: Zniszczalny mur5Projekt: Wyścig po monety
Tocząca się piłkaZbieranie monet3Wyzwalacze
Kolizje wyzwalająceOnTriggerEnterPrzedmioty do zebraniaSkrzynie zatrzymują resztęStrefy śmierciWejście i wyjściePodsumowanie: klucz i drzwiPoćwicz samodzielnie: Edytor online Unity