Использование инструкций yield
Ключевые слова 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” будет происходить в течение трех кадров