Warsztat.GDCompo!ProjektyMediaArtykułyQ&AForumOferty pracyPobieranie

Opisz napotkaną sytuację, a redakcja niezwłocznie znajdzie rozwiązanie!

wyślij anuluj

27. Programowanie JS cz.7 : współprogramy i yield

Tekst został importowany z Warsztatowych artykułów. Jego oryginalnym autorem jest Grzegorz Żak. Jeżeli został importowany poprawnie, usuń ten szablon!

{{Opis|}} WSPÓŁPROGRAM

Współprogramy (Coroutines) są funkcjami pozwalającymi wstrzymać wykonywanie, do czasu wykonania danego polecenia opóźnienia (yield).


INSTRUKCJE YIELD

yield
Współprogram będzie kontynuowany po wykonaniu wszystkich funkcji Update w kolejnej klatce.
yield WaitForSeconds(2)
Kontynuuj po funkjach Update w klatce przypadajacej po ilości sekund określonej w parametrze.
yield WaitForFixedUpdate()
Kontynuuj po wykonaniu wszytskich funkcji FixedUpdate we wszystkich skryptach.
yield WWW
Kontynuuj po kompletnym pobraniu WWW.
yield StartCoroutine(MyFunc)
Kontynuuj po wykonaniu funkcji podanej w parametrze.


SEKWENCJA ZDARZEŃ

Podczas pisania kodu, często jest konieczność napisania skryptu sekwencji zdarzeń.
Problem ten można rozwiązać za pomocą warunków if.

private var stan = 1;

function Update() {
if (stan == 1) {
//kod który wykona się w pierwszym kroku
stan = 2;
return; //przerwij dalsze wykonywanie funkcji
}
if (stan == 2) {
//kod który wykona się w drugim kroku
stan = 3;
return; //przerwij dalsze wykonywanie funkcji
}
if (stan == 3) {
//kod który wykona się w trzecim kroku
stan = 1; //ustaw w kolejnej klatce krok pierwszy
return; //przerwij dalsze wykonywanie funkcji
}
}

W każdej klatce wykonywany jest kolejno pojedynczy krok. Po dojściu do ostatniego kroku w następnej klatce wykonywany jest znowu krok pierwszy, drugi, trzeci itd. Kolejno w 1 klatce wykona się krok pierwszy, w 2 klatce krok drugi, w 3 klatce krok trzeci, w 4 klatce znowu krok pierwszy, w 5 klatce znowu krok drugi itd. Dzięki temu uzyskujemy prostą powtarzającą się sekwencję zdarzeń.
Pomimo poprawnego działania rozwiązania z warunkami if, nie jest ono idealne. Bardziej wygodne jest użycie intrukcji yield.
yield jest specjalną odmianą polecenia return. Bez podanego parametru powoduje przerwanie wykonywania funkcji, aż do kolejnej klatki. W kolejnej klatce funkcja jest wywoływana ponownie i kontynuowana od pierwszej lini kodu po yield.
Powyższy przykład można zapisać następująco:

while(true) {
//kod który wykona się w pierwszym kroku
yield; // czekaj jedną klatkę
//kod który wykona się w drugim kroku
yield; // czekaj jedną klatkę
//kod który wykona się w trzecim kroku
}

Wystarczyło użyć dwóch instrukcji yield. Pozbyliśmy się warunków i zmiennych pomocniczych. Kod wygląda o wiele prościej.


PRZERWANIE WSPÓŁPROGRAMU

Pora na kolejny przykład, żeby jeszcze lepiej zrozumieć zasadę działania yield:

function MyCoroutine()
{
//wykonane jako drugie
yield; //Powrót do funkcji Start
//wykonane jako czwarte
}

function Start()
{
//wykonane jako pierwsze
MyCoroutine();
//wykonane jako trzecie
}

1. Zgodnie z kolejnością wykonywania funkcji jako pierwszy wykonany zostanie kod w funkcji Start, aż do wywołania w niej innej funkcji(MyCoroutine).
2. Jako drugi wykonany zostanie kod w wywołanej funkcji MyCoroutine, aż do wystąpienia instrukcji yield.
3. Instrukcja yield powoduje przerwanie wykonywania MyCoroutine i powrót do funkcji Start. Tu kończy się pierwsza klatka.
4. W kolejnej klatce następuje kontynuowanie wykonywania funkcji MyCoroutine od lini występującej po instrukcji yield, która spowodowała przerwanie.

yield może przyjmować parametry opóźniające wykonanie kolejnej instrukcji do klatki występującej po ilości sekund podanych w parametrze.

Wykonaj ();
//wykonane jako drugie

function Wykonaj () {
//wykonane jako pierwsze
yield WaitForSeconds (2);
//wykonane jako trzecie po 2 sekundach
}

1. Najpierw wywołana zostaje funkcja Wykonaj i wykonana jej zawartość, aż do wystąpienia instrukcji yield.
2. Instrukcja yield powoduje powrót z funkcji do lini kodu po jej wywołaniu.
3. W klatce występującej po 2 sekundach od wykonania intrukcji yield następuje powrót do lini występującej po instrukcji yield w funkcji Wykonaj.

Powyższe przykłady po przerwaniu przez yield wywołanej funkcji natychmiastowo przechodziły do lini kodu po wywołaniu tej funkcji niezależnie od długości opóźnienia.
Istnieje też możliwość takiego wywołania funkcji, żeby przejście do lini kodu po wywołaniu jej i wystąpieniu instrukcji yield nastąpiło po całkowitym zakończeniu wykonywania funkcji.

yield StartCoroutine("Wykonaj");
//po 2 sekundach wykonane jako trzecie

function Wykonaj () {
//po wywołaniu wykonane jako pierwsze
yield WaitForSeconds (2);
//po 2 sekundach wykonane jako drugie
}

1. Najpierw wywołany zostaje współprogram Wykonaj i wykonane wszystkie instrukcje, aż do wystąpienia instrukcji yield.
2. Po 2 sekundach kontynuowane jest wykonywanie współprogramu Wykonaj aż do całkowitego zakończenia.
3. Po wykonaniu całego współprogramu przechodzimy do lini po wywołaniu współprogramu.


ĆWICZENIA

1. Przyjrzyj się kodom poniżej i ustal kolejność wykonywania sekwencji. Zaznaczyłem 4 charakterystyczne punkty w kodach za pomoca liter A-D. Całkowite wykonanie każdego z kodów będzie składało się z 6 sekwencji. Wypisz 6 liter dla każdego z nich i sprawdź później, czy miałeś rację przeglądajać konsolę po pełnym wykonaniu kodu.
a)

yield StartCoroutine("Wykonaj");
print("A");
Wykonaj ();
print("B");

function Wykonaj () {
print("C");
yield WaitForSeconds (5);
print("D");
}

b)

Wykonaj ();
print("A");
yield StartCoroutine("Wykonaj");
print("B");

function Wykonaj () {
print("C");
yield WaitForSeconds (5);
print("D");
}

Jeśli udało Ci się rozwiązać zadanie bezbłędnie gratuluję. Jeśli nie udało Ci się tego zrobić przeanalizuj kod krok po kroku korzystając z wyniku z konsoli.

by Grzegorz Żak (sztacheta28) Forum o Unity

Tekst dodał:
Grzegorz Żak
29.08.2011 21:01

Ostatnia edycja:
Grzegorz Żak
29.08.2011 21:01

Kategorie:

Aby edytować tekst, musisz się zalogować.

# Edytuj Porównaj Czas Autor Rozmiar
#1 edytuj 29.08.2011 21:01 Grzegorz Żak 6.77 KB
Zwykły
Do sprawdzenia
Do akceptacji
  • Napisz komentarz:
    Aby dodać swój komentarz, musisz się zalogować.
Licencja Creative Commons

Warsztat używa plików cookies. | Copyright © 2006-2017 Warsztat · Kontakt · Regulamin i polityka prywatności
build #ff080b4740 (Tue Mar 25 11:39:28 CET 2014)