Czy `return return false;` ma specjalne znaczenie w skryptach C # Unity3d?

17

W Unity mamy specjalne rzeczy dla coroutines, które są dodatkowe w stosunku do normalnego C #.

na przykład możemy użyć

yield return WaitForSeconds(5.f);

aby coroutine odczekał 5 sekund przed kontynuowaniem.

Co robisz yield return false;i co yield return true;robisz?

Almo
źródło
hm nie jestem pewien, czy yield return truerobi coś specjalnego. Ale yield return nullpo prostu zatrzymuje się na klatkę, więc podejrzewam, że yield return falsema dokładnie taki sam efekt (również yield return 0ponieważ 0 false null są takie same pod maską)
jhocking
@jhocking „ponieważ 0 fałszywych zer jest takich samych pod maską” Dlaczego to ma znaczenie? C # jest bardzo mocno napisanym językiem, więc przez większość czasu to, jak coś wygląda „pod maską”, nie ma znaczenia. Na przykład nie możesz po prostu zrobić if (0)lub if (null), inaczej niż w C i C ++.
svick,
wzruszając ramionami, to nie ma znaczenia. wszystko, co wiem, to yield return 0działa; najwyraźniej z powodu wyjaśnienia MLM
jhocking
2
Nie jest to dodatkowe w stosunku do normalnego C #. Słowo yieldkluczowe istnieje od co najmniej C # 2.0. Wszystko, co robi, to nazywa to coroutine i obsługuje wygenerowany iterator oraz wartości zwrócone z niego w sposób, który może powodować nieblokujące opóźnienia w wykonywaniu kodu.
LUB Mapper
1
@Almo: To po prostu dlatego, że WaitForSecondsnie zostało zadeklarowane. Gdy tylko zadeklarujesz metodę o nazwie, WaitForSecondsktóra pobiera argument zmiennoprzecinkowy i zwraca typ elementu wyliczanego elementu, kompiluje się ponownie. Dlatego yieldnie jest wyjątkowy dla Jedności. Jeśli już, WaitForSecondsmetoda ta jest wyjątkowa dla Unity, ale nawet wtedy nie rozszerza języka C #, ale jest po prostu dodatkową metodą napisaną przy użyciu standardowego C #.
LUB Mapper

Odpowiedzi:

19

Jedyne możliwe wartości wydajności, które planista rozumie, to:

  • Klasy pochodzące z YieldInstruction( WaitForSeconds, WaitForEndOfFrame, WaitForFixedUpdate, AssetBundleCreateRequest, AssetBundleRequesti współprogram
  • WWWprzedmiot
  • „dowolna inna wartość”, która nie jest jedną z powyższych.

Jeśli otrzymana zostanie „jakakolwiek inna wartość” (która obejmuje „null” wartość ciągu dowolnego innego typu podstawowego, takiego jak int, bool , ... lub odwołanie do dowolnego obiektu, który nie jest jednym z wyżej wymienionych), program planujący „zaplanuj” coroutine na następną klatkę .

- Odpowiedź Bunny83: wybitny członek na Unity Answers

WaitForEndOfFrameI inni podobnego, to tylko puste funkcje tag YieldInstructionw celu podjęcia decyzji, co zrobić w silniku.

Domyślnie wydaje się, że tak jest WaitForEndOfFrame. Więc jeśli masz yield returncoś, co nie ma specjalnego znaczenia, takie jak bool, jest to to samo, co WaitForEndOfFrame.

Wydaje się, że nie ma oficjalnej dokumentacji na temat tego zachowania.


Aktualizacja

Rutter skomentował inny specjalny przypadek:yield return null

Wszystkie Unity Coroutines, w tym yield return nulluruchamiane przed renderowaniem ramki, z wyjątkiem WaitForEndOfFrame. Można znaleźć Rutter jest niesamowite odpowiedź na co Jedności odpowiedzi Wyjaśniając to dalej (ładne schematy zestawie).

MLM
źródło
6
Często przyjmuje się, że wydajność nulli WaitForEndOfFramesą takie same, ale w rzeczywistości są nieco inne , jak opisano na stronie podręcznika polecenia wykonania .
rutter