2014-09-04 1 views
0

Je veux comprendre la syntaxe des coroutines en C# (car cela me semble vraiment inhabituel ...).Coroutines Unity

Quand nous faisons quelque chose comme:

yield return new WaitForSeconds(2.0f); 

Firstable: Je comprends l'objectif de cette déclaration, mais pas la syntaxe.

Que représente la classe WaitForSeconds? Il devrait être de type IEnumerator car c'est le type de retour de la fonction.Mais selon le document http://docs.unity3d.com/ScriptReference/WaitForSeconds-ctor.html, cela n'a pas de type de retour et c'est une instruction de rendement (donc confondue là)

Alors, quel est l'objectif du rendement dans ce Cas ?

Et pourquoi le mélangeons-nous avec le mot-clé return?

Merci d'avance.

+2

écrivait une réponse, mais, fondamentalement, il devrait se terminer d'être un copier-coller de ce site: http://twistedoakstudios.com/blog/Post83_coroutines-more-than-you-want-to-know Je suppose que vous savez ce que fait une coroutine et pourquoi cela peut être utile, sinon ce lien serait inutile. – GameDeveloper

+0

Vous auriez dû ajouter cela comme réponse;) – ryanscottmurphy

Répondre

0

L'utilisation de l'appel return rend un IEnumerable du type retourné. Cela permet à la fonction appelante de traiter une liste de valeurs au moment où elles sont calculées au lieu de toutes à la fois, comme si vous veniez de renvoyer une collection. Dans Unity3d, ceci est important car le cycle de dessin se déroule essentiellement sur un seul thread. Vous pouvez donc utiliser des coroutines et la syntaxe return return pour imbriquer les comportements dans vos scripts. Le nouvel appel WaitForSeconds (...) permet au contexte d'exécution de retourner à l'appelant extérieur pendant un certain temps tout en traitant un no-op en interrompant effectivement l'exécution de ce MonoBehaviour, sans interrompre le thread de dessin entier.

0

Il vous permet simplement d'exécuter un morceau de code en parallèle.

par exemple:

IEnumerator PrintAfterDelay() 
{ 
    yield return new WaitForSeconds(5.0f); 

    //Rest of the code in this method will execute after 5 seconds while all 
all other code will be execute in parallel 
    Debug.Log("Now I am here after 5 Seconds"); 
} 

appel dans Démarrer() par exemple.

void Start() 
{ 
    StartCoroutine("PrintAfterDelay"); 
    Debug.Log("I am here"); 
}