Unité - IEnumerator du yield return null
Je suis en train d'essayer de comprendre IEnumerator & Coroutine dans le contexte de l'Unité et ne suis pas trop confiant sur ce que le "yield return null" effectue. Pour le moment, je crois qu'il est fondamentalement des pauses et des attentes pour la prochaine image et dans l'image suivante, il va revenir en arrière pour effectuer le tout relevé à nouveau.
Si je quitte le "yield return null" il semble que l'objet va passer instantanément à sa destination ou peut-être "sauter un grand nombre de cadres". Donc je suppose que ma question est comment est-ce que "yield return null" fonction au sein de cette boucle et pourquoi est-il nécessaire de l'avoir.
void Start () {
StartCoroutine(Move());
}
IEnumerator Move(){
while (a > 0.5f){
... (moves object up/down)
yield return null; //<---------
}
yield return new WaitForSeconds(0.5f);
.... (moves object up/down)
StartCoroutine(Move());
}
yield return
est en fait un raccourci pour dire "attendre jusqu'à la prochaine mise à jour pour continuer". Si vous ne l'avez pas, la boucle while va courir tout le chemin à l'achèvement des travaux sur une mise à jour unique, c'est pourquoi l'objet se déplace instantanément sans elle.OriginalL'auteur WonderfulWonder | 2017-01-18
Vous devez vous connecter pour publier un commentaire.
Le programme va commencer la boucle, si vous n'avez pas eu le rendement, il fonctionne tout simplement tous itération au sein de la même image.
Si vous avez eu des millions d'itération, alors il serait le plus susceptible de bloquer votre programme jusqu'à ce que toutes les itérations sont effectuées et puis continuer.
Lors de la création d'une coroutine, l'Unité s'attache à un MonoBehaviour objet. Il sera exécuté en premier sur appel de fo le StartCoroutine jusqu'à un taux de rendement est atteint. Ensuite, il sera de retour à partir de la coroutine et de le placer dans une pile en fonction du rendement. Si la valeur est null, alors il sera exécuté à la prochaine image. Certains coroutine peut WaitForEndOfFrame si ils ont besoin pour exécuter cette action à ce moment précis. Dans certains cas, vous pouvez démarrer une minuterie comme vous l'avez fait dans le second cas.
À ce point, la coroutine est éteint, et le programme est en mesure d'exécuter le reste. Sur l'image suivante, l'Unité sera de trouver empilés coroutine et les appeler à partir de là où ils l'avaient laissé.
Si la boucle n'atteint jamais un état vrai, alors en gros, vous avez créé une méthode de mise à jour.
Le but de la coroutine est d'effectuer des actions qui s'étendrait sur une période sans bloquer le programme.
FAIT IMPORTANT: ce n'est pas le multi-threading.
OriginalL'auteur Everts
Vous sont corrects.
yield return null
va attendre jusqu'à la prochaine image, puis continuer l'exécution. Dans votre cas, il va vérifier la condition de ta boucle while l'image suivante.Le "pourquoi cela est nécessaire" est probablement parce que vous voulez que l'objet à déplacer par une entrée à chaque image. Sans
yield return null
juste s'exécute à travers la boucle while dans une image.Plus essentiel: Il semble que vous voulez
Update
chaque image et d'ajuster la psoition. Vous pouvez facilement utiliser laUpdate ()
. Cette fonction sera appelée par l'Unité de toutes les images sur un script actif.OriginalL'auteur Max Auer