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ę.
Wyzwanie
ŁatwySpacja 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 zapisujeOpen. - 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 zapisujeClosed.
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;
}
}
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 startowa2Kolizje
OnCollisionEnterW co uderzyłem?Rozbijanie przy zderzeniuStanie na podłożuOdbicie i tarcieKształty colliderówPodsumowanie: Zniszczalny mur