Hat `yield return false;` in Unity3d C # -Skripten eine besondere Bedeutung?

17

In Unity haben wir einige spezielle Dinge für Coroutinen, die zusätzlich zu normalem C # existieren.

Zum Beispiel können wir verwenden

yield return WaitForSeconds(5.f);

Warten Sie 5 Sekunden, bevor Sie fortfahren.

Was machen yield return false;und yield return true;tun?

Almo
quelle
hm ich bin mir nicht sicher ob yield return truedas was besonderes macht. Aber yield return nullpausiert einfach für einen Frame, also vermute ich, dass yield return falsedas genau den gleichen Effekt hat (auch yield return 0da 0 falsch null sind alle gleich unter der Haube)
jhocking
@jhocking "da 0 falsch null sind alle gleich unter der Haube" Warum ist das wichtig? C # ist eine stark typisierte Sprache, daher spielt es die meiste Zeit keine Rolle, wie etwas „unter der Haube“ aussieht. Zum Beispiel können Sie nicht einfach if (0)oder if (null), anders als in C und C ++.
Svick
Achselzucken ist dann egal. Ich weiß nur, dass es yield return 0funktioniert. anscheinend aus dem Grund MLM erklärt
5.
2
Dies gilt nicht zusätzlich zu normalem C #. Das yieldSchlüsselwort gibt es seit mindestens C # 2.0. Alles, was Unity tut, ist, es als Coroutine zu bezeichnen und den generierten Iterator und die von ihm zurückgegebenen Werte so zu behandeln, dass Sie nicht blockierende Verzögerungen bei der Ausführung Ihres Codes verursachen können.
ODER Mapper
1
@Almo: Das liegt einfach daran, dass WaitForSecondses nicht deklariert ist. Sobald Sie eine aufgerufene Methode deklarieren WaitForSeconds, die ein float-Argument akzeptiert und den Elementtyp der von Ihnen implementierten Enumeration zurückgibt, wird sie erneut kompiliert. Daher yieldist die Einheit nichts Besonderes. Wenn überhaupt, ist die WaitForSecondsMethode eine Besonderheit von Unity, aber selbst dann erweitert sie nicht die Sprache C #, sondern ist einfach eine zusätzliche Methode, die mit Standard-C # geschrieben wurde.
ODER Mapper

Antworten:

19

Die einzigen möglichen Ertragswerte, die der Scheduler versteht, sind:

  • Klassen abgeleitet von YieldInstruction( WaitForSeconds, WaitForEndOfFrame, WaitForFixedUpdate, AssetBundleCreateRequest, AssetBundleRequestund Coroutine
  • ein WWWObjekt
  • "Jeder andere Wert", der nicht zu den oben genannten gehört.

Wenn "irgendein anderer Wert" ausgegeben wird (der "null" einen Zeichenkettenwert eines anderen Basistyps wie int, bool , ... oder einen Verweis auf ein beliebiges Objekt enthält, das nicht eines der oben genannten ist), wird der Scheduler dies tun "plane" die Coroutine für den nächsten Frame .

- Bunny83 Antwort: Prominentes Mitglied bei Unity Answers

Die WaitForEndOfFrameund andere der gleichen sind nur leere Funktionen, die das markieren, YieldInstructionum zu entscheiden, was in der Maschine zu tun ist.

Der Standardfall scheint zu sein WaitForEndOfFrame. Also, wenn Sie yield returnetwas, das keine besondere Bedeutung hat, wie ein Bool, ist es das gleiche wie WaitForEndOfFrame.

Es scheint keine offizielle Dokumentation zu diesem Verhalten zu geben.


Aktualisieren

Rutter kommentierte einen weiteren Sonderfall:yield return null

Alle Unity Coroutines, einschließlich yield return null, werden ausgeführt, bevor der Frame gerendert wird , mit Ausnahme von WaitForEndOfFrame. Sie können finden rutter ‚s super Antwort über bei Unity Antworten erklären , diese weiter (schöne Diagramme enthalten).

MLM
quelle
6
Es ist üblich anzunehmen, dass Nachgeben nullund gleich WaitForEndOfFramesind, aber sie unterscheiden sich geringfügig , wie auf der Handbuchseite zur Ausführungsreihenfolge beschrieben .
Rutter