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)

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