Я смущен и интересуюсь тем, как сопрограммы (в Unity3D и, возможно, в других местах). Является ли coroutine новой нитью? Unity documentation они сказали:
Корутин - это функция, которая может приостановить ее выполнение (выход) до тех пор, пока не будет завершена заданная YieldInstruction.
И у них есть примеры С# здесь:
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 в следующий раз он называется". Еслиyield
является специальнымreturn
, что здесь делаетreturn
? -
Зачем нам возвращать
IEnumerator
? -
Создает ли
StartCoroutine
новый поток? -
Сколько раз в предыдущем примере вызывается
WaitAndPrint()
? Действительно лиyield return new WaitForSeconds(waitTime);
вернулся? Если да, то, думаю,WaitAndPrint()
вызывается дважды в приведенном выше коде. И я думаю,StartCoroutine()
вызывалWaitAndPrint()
несколько раз. Тем не менее, я увидел еще одну документацию Unity, в которой говорится: "Выполнение сопрограммы можно приостановить в любой момент с помощью инструкции yield. указывает, когда сопрограмма возобновлена ". Эти слова заставляют меня чувствовать, чтоWaitAndPrint()
на самом деле не вернулся; это было просто приостановлено; он ожидал возвращенияWaitForSeconds()
. Если это так, то в приведенном выше кодеWaitAndPrint()
был вызван только один раз, аStartCoroutine
просто отвечал за запуск функции, а не вызывал ее несколько раз.