Использование инструкций 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");
    }

Теперь, при вызове действий из блокли в консоли можно будет увидеть следующее:

../../../_images/image_58.png

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