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
просто отвечал за запуск функции, а не вызывал ее несколько раз.