Est-ce que `return return false; 'a une signification spéciale dans les scripts Unity3d C #?

17

Dans Unity, nous avons des choses spéciales pour les coroutines qui s'ajoutent au C # normal.

par exemple, nous pouvons utiliser

yield return WaitForSeconds(5.f);

faire attendre une coroutine 5 secondes avant de continuer.

Que faire yield return false;et yield return true;faire?

Almo
la source
hm je ne sais pas si yield return truefait quelque chose de spécial. Mais yield return nulls'arrête simplement pour un cadre, donc je soupçonne que cela yield return falsea exactement le même effet (également yield return 0depuis 0 faux nul sont tous les mêmes sous le capot)
jhocking
@jhocking "puisque 0 faux nul sont tous les mêmes sous le capot" Pourquoi est-ce important? C # est un langage fortement typé, donc la plupart du temps, l'apparence de quelque chose «sous le capot» n'a pas d'importance. Par exemple, vous ne pouvez pas simplement faire if (0)ou if (null), contrairement à C et C ++.
svick
hausser les épaules alors ce n'est pas grave. tout ce que je sais, c'est que cela yield return 0fonctionne; apparemment à cause de la raison expliquée par MLM
jhocking
2
Ce n'est pas supplémentaire au C # normal. Le yieldmot-clé existe depuis au moins C # 2.0. Unity ne fait que l'appeler coroutine et gère l'itérateur généré et les valeurs qui en sont retournées de manière à ce que vous puissiez provoquer des retards non bloquants dans l'exécution de votre code.
OR Mapper
1
@Almo: C'est tout simplement parce que WaitForSecondsn'est pas déclaré. Dès que vous déclarez une méthode appelée WaitForSecondsqui prend un argument float et qui renvoie le type d'élément de l'énumération que vous implémentez, elle se compile à nouveau. Par conséquent, yieldn'est pas spécial pour l'unité. Si quoi que ce soit, la WaitForSecondsméthode est spéciale à Unity, mais même dans ce cas, elle n'étend pas le langage C #, mais est simplement une méthode supplémentaire qui a été écrite en utilisant le C # standard.
OR Mapper

Réponses:

19

Les seules valeurs de rendement possibles que le planificateur comprend sont:

  • Classes dérivées de YieldInstruction ( WaitForSeconds, WaitForEndOfFrame, WaitForFixedUpdate, AssetBundleCreateRequest, AssetBundleRequestet Coroutine
  • un WWWobjet
  • "toute autre valeur" qui ne fait pas partie de ce qui précède.

Si "toute autre valeur" est fournie (qui inclut "null" une valeur de chaîne tout autre type de base tel que int, bool , ... ou une référence à un objet arbitraire qui n'est pas l'un des mentionnés ci-dessus), l'ordonnanceur "planifier" la coroutine pour la trame suivante .

- Réponse de Bunny83: membre éminent de Unity Answers

le WaitForEndOfFrame et d'autres similaires ne sont que des fonctions vierges qui marquent le YieldInstructionafin de décider quoi faire dans le moteur.

Le cas par défaut semble être WaitForEndOfFrame. Donc si vousyield return quelque chose qui n'a pas de signification particulière, comme un bool, c'est la même chose que WaitForEndOfFrame.

Il ne semble pas y avoir de documentation officielle sur ce comportement.


Mise à jour

rutter commenté un autre cas spécial:yield return null

Toutes les coroutines Unity, y compris yield return null, s'exécutent avant le rendu du cadre, à l'exception de WaitForEndOfFrame. Vous pouvez trouver la réponse impressionnante de rutter sur Unity Answers expliquant cela plus en détail (beaux diagrammes inclus).

MLM
la source
6
Il est courant de penser que cédait nullet WaitForEndOfFramesont les mêmes, mais ils sont en fait légèrement différentes , comme indiqué à l' ordre d'exécution page de manuel.
rutter