Ключевые слова yield return и следующие за ними инструкции необходимы для того, чтобы определить, какое время будет ожидать корутина до своего следующего вызова. Для примера, возьмем код из предыдущего раздела:
while (true)
{
yield return new WaitForEndOfFrame();
}
Такой цикл будет выполняться бесконечное количество раз до остановки программы, но один раз за кадр. При этом ключевые слова yield return здесь являются “точкой ожидания”, а последующие инструкции указывают “время ожидания”
Список возможных инструкций для yield
// Корутина ожидает конца кадра
yield return null;
// Корутина ожидает конца кадра
yield return new WaitForEndOfFrame();
// Корутина ожидает кадра физики
yield return new WaitForFixedUpdate();
// Корутина ожидает некоторое время с учетом time-scale
yield return new WaitForSeconds(1);
// Корутина ожидает некоторое время без учета time-scale
yield return new WaitForSecondsRealtime(1);
// Прерывает выполнение корутины
yield break;
Обратите внимание, что корутина не обязана иметь цикл внутри. Для примера, изменим код блока действия:
[Action(English: "action 2", Russian: "действие 2")]
public IEnumerator Action2()
{
Debug.Log("Message 2.1");
yield return new WaitForEndOfFrame();
Debug.Log("Message 2.2");
yield return new WaitForEndOfFrame();
Debug.Log("Message 2.3");
}
Теперь, при вызове действий из блокли в консоли можно будет увидеть следующее:

При ожидании на yield return new WaitForEndOfFrame() выполнение корутины приостановится до конца кадра, и продолжится только на следующем. Таким образом, выполнение нового блока “действие 2” будет происходить в течение трех кадров