Конечно, это работает
Я сделал что-то вроде этого раньше, вы можете абсолютно yield
метод, который он сам по себе дает, потому что происходит то, что выполнение полностью линейный и когда PerformRequest
возвращает и возвращает какое-то значение (веб-запрос, но на самом деле не важно), которое распространяется до yield return...
в PerformRequest2
, которое затем распространяется вверх до PerformRequest3
. Unity возобновит выполнение в правильном месте просто отлично (и вы могли бы также ответить на свой вопрос, протестировав его;).
По сути, это то же самое, что и любая другая вложенная функция, например
int GetValue() {
return 4;
}
int GetValue2() {
return GetValue();
}
Выполняется точно так же, как (только с другим типом):
IEnumerator GetValue() {
return new SomeIEnumerator();
}
IEnumerator GetValue2() {
return GetValue();
}
, который преобразуется в результат сопрограммы (yield
- это просто специальное ключевое слово, оно не влияет на тип возвращаемого значения!):
IEnumerator GetValue() {
yield return new SomeIEnumerator();
}
IEnumerator GetValue2() {
yield return GetValue();
}
Вы также можете сделать это следующим образом, но я обычно не могу найти в нем никакого значения:
IEnumerator GetValue() {
yield return new SomeIEnumerator();
}
IEnumerator GetValue2() {
//other stuff, with yield so our function still returns a value
StarCoroutine(GetValue());
//this stuff runs without waiting
}
Adassko также нашел этот замечательный урок о сопрограммах и вложенных сопрограммах.