Создание корутинного блока
Изменим код существующего блока так, чтобы обычный блок действия стал корутинным:
[Action(English: "action 2", Russian: "действие 2")] public IEnumerator Action2() { while (true) { yield return new WaitForEndOfFrame(); } Debug.Log("Message 2"); }
Как вы можете заметить, для создания корутинного блока действия, нужно, чтобы метод этого действия имел возвращаемый тип IEnumerator, а также хотя бы одну инструкцию yield внутри
Подробнее про yield в разделе Использование инструкций yield
После изменения кода и повторной сборки объекта, вы сможете заметить, как изменился блок действия в Blockly:
Иконка слева от “выполнить” означает, что действие стало корутинным. В выпадающем списке можно выбрать тип выполнения блоков: если выбрана иконка песочных часов, то выполнение станет последовательным и следующие за корутиной блоки будут “дожидаться” окончания выполнения корутины. Если выбрана иконка молнии, то выполнение станет параллельным и следующие за корутиной блоки будут выполняться сразу за её началом, не дожидаясь её окончания
Теперь, при выполнении кода этого действия, приложение не будет блокироваться полностью до его окончания
Подробнее про использование корутин в Blockly смотри в разделе НЕ смог понять куда это должно перенаправлять
Изменим блок инициализации так, чтобы он соответствовал представленному:
Теперь у блока “действие 2” появилась иконка, обозначающее, что действие выполняется параллельно, то есть сразу после запуска блока “действие 2” будет выполнен блок “действие 3”
Теперь, при запуске приложения в консоли можно будет увидеть два сообщения:
Код, вызывающий показ Message 2 не будет выполнен никогда, так как цикл внутри блока корутины все-еще является бесконечным. При этом Message 3 будет показан, так как мы не дожидаемся окончания выполнения “действия 2”