Создание корутинного блока

Изменим код существующего блока так, чтобы обычный блок действия стал корутинным:

[Action(English: "action 2", Russian: "действие 2")]
    public IEnumerator Action2()
    {
        while (true)
        {
            yield return new WaitForEndOfFrame();
        }
        Debug.Log("Message 2");
    }

Как вы можете заметить, для создания корутинного блока действия, нужно, чтобы метод этого действия имел возвращаемый тип IEnumerator, а также хотя бы одну инструкцию yield внутри.

Примечание

Подробнее про yield в разделе Использование инструкций yield.

После изменения кода и повторной сборки объекта, вы сможете заметить, как изменился блок действия в Blockly:

../../../_images/image_216.png

Иконка слева от “выполнить” означает, что действие стало корутинным. В выпадающем списке можно выбрать тип выполнения блоков: если выбрана иконка песочных часов, то выполнение станет последовательным и следующие за корутиной блоки будут “дожидаться” окончания выполнения корутины. Если выбрана иконка молнии, то выполнение станет параллельным и следующие за корутиной блоки будут выполняться сразу за её началом, не дожидаясь её окончания.

Теперь, при выполнении кода этого действия, приложение не будет блокироваться полностью до его окончания.

Примечание

Подробнее про использование корутин в Blockly смотри в разделе НЕ смог понять куда это должно перенаправлять.

Изменим блок инициализации так, чтобы он соответствовал представленному:

../../../_images/image_310.png

Теперь у блока “действие 2” появилась иконка, обозначающее, что действие выполняется параллельно, то есть сразу после запуска блока “действие 2” будет выполнен блок “действие 3”.

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

../../../_images/image_411.png

Внимание

Код, вызывающий показ Message 2 не будет выполнен никогда, так как цикл внутри блока корутины все-еще является бесконечным. При этом Message 3 будет показан, так как мы не дожидаемся окончания выполнения “действия 2”