¿Es una nueva cadena de hilos en Unity3D?

Estoy confundido y curioso sobre cómocoroutines (En Unity3D y quizás otros lugares) trabajo. ¿Es la coroutine un hilo nuevo? De la unidaddocumentación ellos dijeron:

Una coroutine es una función que puede suspender su ejecución (rendimiento) hasta que finalice la instrucción de rendimiento determinada.

Y tienen ejemplos de C #.aquí:

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);
    }
}

Tengo muchas preguntas sobre este ejemplo:

En el ejemplo anterior, ¿qué línea es la corutina? EsWaitAndPrint() una coroutine? EsWaitForSeconds() una coroutine?

En esta línea:yield return new WaitForSeconds(waitTime);por que ambosyield yreturn ¿están presentes? Leo enDocumentación de la unidad que "la declaración de rendimiento es un tipo especial de rendimiento, que garantiza que la función continuará desde la línea después de la declaración de rendimiento la próxima vez que se llame". Siyield es un especialreturn, que esreturn ¿haciendo aquí?

¿Por qué tenemos que devolver unIEnumerator?

HaceStartCoroutine iniciar un nuevo hilo?

Cuantas veces haWaitAndPrint() sido llamado en el ejemplo anterior? Hizoyield return new WaitForSeconds(waitTime); realmente regresó? Si sí, entonces supongoWaitAndPrint() Se llamó dos veces en el código anterior. Y supongoStartCoroutine() estaba llamandoWaitAndPrint() varias veces. Sin embargo, viOtra documentación de Unity. que dice: "La ejecución de una coroutine se puede pausar en cualquier punto utilizando la declaración de rendimiento. El valor de rendimiento de rendimiento especifica cuándo se reanuda la coroutine". Estas palabras me hacen sentir queWaitAndPrint() en realidad no ha regresado; fue simplemente pausado; estaba esperandoWaitForSeconds() regresar. Si este es el caso, entonces en el código anteriorWaitAndPrint() fue llamado una sola vez, yStartCoroutine fue el único responsable de iniciar la función, no de llamarla varias veces.

Respuestas a la pregunta(1)

Su respuesta a la pregunta