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