Ist Coroutine ein neuer Thread in Unity3D?
Ich bin verwirrt und neugierig wieCoroutinen (in Unity3D und vielleicht an anderen Orten) arbeiten. Ist Coroutine ein neuer Thread? Einheit istDokumentation Sie sagten:
Eine Coroutine ist eine Funktion, die ihre Ausführung (Yield) anhalten kann, bis die angegebene YieldInstruction beendet ist.
Und sie haben C # BeispieleHier:
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void Start() {
print("Starting " + Time.time);
StartCoroutine(WaitAndPrint(2.0F));
print("Before WaitAndPrint Finishes " + Time.time);
}
IEnumerator WaitAndPrint(float waitTime) {
yield return new WaitForSeconds(waitTime);
print("WaitAndPrint " + Time.time);
}
}
Ich habe viele Fragen zu diesem Beispiel:
Welche Linie ist im obigen Beispiel die Koroutine? IstWaitAndPrint()
eine Coroutine? IstWaitForSeconds()
eine Coroutine?
In dieser Zeile:yield return new WaitForSeconds(waitTime);
, warum beidesyield
undreturn
sind anwesend? Ich lese inUnity-Dokumentation dass "Die Yield-Anweisung ist eine besondere Art der Rückgabe, die sicherstellt, dass die Funktion beim nächsten Aufruf von der Zeile nach der Yield-Anweisung fortgesetzt wird." Obyield
ist ein besonderesreturn
, was istreturn
hier machen?
Warum müssen wir eine zurückgeben?IEnumerator
?
TutStartCoroutine
Einen neuen Thread starten?
Wie oft hatWaitAndPrint()
wurde im obigen Beispiel aufgerufen? Habenyield return new WaitForSeconds(waitTime);
wirklich zurückgekehrt? Wenn ja, dann denke ichWaitAndPrint()
wurde im obigen Code zweimal aufgerufen. Und ich denkeStartCoroutine()
hat gerufenWaitAndPrint()
mehrmals. Ich habe es jedoch geseheneine weitere Unity-Dokumentation das besagt: "Die Ausführung einer Coroutine kann jederzeit mit der yield-Anweisung angehalten werden. Der yield-Rückgabewert gibt an, wann die Coroutine wieder aufgenommen wird." Diese Worte lassen mich das fühlenWaitAndPrint()
ist eigentlich nicht zurückgekehrt; es wurde nur angehalten; es wartete aufWaitForSeconds()
zurückgeben. Wenn dies der Fall ist, dann im obigen CodeWaitAndPrint()
wurde nur einmal aufgerufen undStartCoroutine
war nur dafür verantwortlich, die Funktion zu starten und sie nicht mehrmals aufzurufen.