Coroutine - новая тема в Unity3D?

Я смущен и любопытно о том, каксопрограммы (в Unity3D и, возможно, в других местах) работают. Это сопрограмма новая тема? Юнитидокументация Они сказали:

Сопрограмма - это функция, которая может приостановить свое выполнение (yield) до завершения данной инструкции YieldInstruction.

И у них есть примеры C #Вот:

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

У меня много вопросов об этом примере:

В приведенном выше примере, какая строка является сопрограммой? ЯвляетсяWaitAndPrint() сопрограмма? ЯвляетсяWaitForSeconds() сопрограмма?

В этой строке:yield return new WaitForSeconds(waitTime);почему обаyield а такжеreturn присутствуют? Я читаю вДокументация Unity тот "Оператор yield - это особый вид возврата, который гарантирует, что функция будет продолжена со строки после оператора выхода в следующий раз, когда она вызывается ». Еслиyield это особыйreturn, что такоеreturn делаешь здесь?

Почему мы должны вернуть?IEnumerator

Есть лиStartCoroutine начать новую тему?

Сколько разWaitAndPrint() был вызван в приведенном выше примере? Сделалyield return new WaitForSeconds(waitTime); действительно вернулся? Если да, то я думаю,WaitAndPrint() был вызван дважды в приведенном выше коде. И я думаюStartCoroutine() звонилWaitAndPrint() многократно. Тем не менее, я виделдругая документация Unity что говорит: "Выполнение сопрограммы может быть приостановлено в любой момент с помощью оператора yield. Возвращаемое значение указывает, когда сопрограмма возобновляется. " Эти слова заставляют меня чувствовать, чтоWaitAndPrint() на самом деле не вернулся; это было просто приостановлено; это ждалиWaitForSeconds() возвращать. Если это так, то в приведенном выше кодеWaitAndPrint() был вызван только один раз, иStartCoroutine просто отвечал за запуск функции, а не вызывал ее несколько раз.

Ответы на вопрос(1)

Ваш ответ на вопрос