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.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage