Сопрограммы (Coroutine) в Unity
Решил написать маленький тутор по использованию корутин.
В Unity есть набор корутин, позволяющих облегчить разработку последовательно изменяющихся/выполняющихся действий. Большинство из них я опишу ниже. А для начала давайте взглянем на код: PHP код:
Суть работы кода такова: текстура на экране двигается по фигуре "крендель" с равной скоростью. Ничего особенного, и я даже пример выбрал не особо показательный, но все же продолжу. Корутина позволяет прерывать вычисления функции и продолжать с того же места, на котором остановились. В моем примере есть функция Coroutine, которая имеет бесконечный цикл, из которого нет выхода. Каждая итерация цикла считает новое положение текстуры на экране и останавливается на 10 мс, перед тем как продолжить. Но загадка в том, что прерывание этой функции происходит не с помощью остановки процесса, а с помощью механизма корутин юнити. Итак последовательно: 1. При старте скрипта запускается корутина (функция с названием Coroutine). 2. Эта функция выполняется до строчки yield return new WaitForSeconds(0.01f); которая прерывает ее работу на 10 миллисекунд. 3. Прерывание не влияет на остальные функции (процесс не останавливается и действие происходит в том же потоке) 4. По истечении времени корутина продолжает бесконечный цикл пока снова не доходит до строки с задержкой. 5. Функция OnGUI рисует текстуру на экране. Возможные прерывания выполнения кода: 1. yield return null; - прерывает выполнение корутины до следующего кадра. 2. yield break; завершает выполнение корутины. 3. yield return new WaitForSeconds( количество секунд ); - прерывает на время. 4. yield return new WaitForEndOfFrame(); - прерывает выполнение до конца кадра. 5. yield return new WaitForFixedUpdate(); - прерывает выполнение до кадра, в котором обновляется физика. Специфическое использование: PHP код:
Еще один пример как можно реализовать то же самое, что и выше в функции Coroutine но без бесконечного цикла: PHP код:
Кода можно применять: например для распределения тяжелых вычислений на несколько кадров, для последовательного изменения чего-то и т.д. Ну вот и все на сегодня :). |
Ответ: Сопрограммы (Coroutine) в Unity
Напишу что у меня по поводу короутинов:
(коды только изучаю, особо не знаю как ошибки исправлять, просто стараюсь их обходить и не создавать) просто пишу свою мыслю void Start() { StartCoroutine("AimCoroutine"); StartCoroutine(SpawnCoroutine()); } IEnumerator AimCoroutine() { while(true) { yield return new WaitForSeconds(0.1f); //некий код StopCoroutine("AimCoroutine"); //короутин сам себя прекратит, если нужно одноразовое использование } } IEnumerator SpawnCoroutine() { while(true) { yield return new WaitForSeconds(3.0f-speed); //некий код StopCoroutine(SpawnCoroutine); //либо StopCoroutine(SpawnCoroutine()) //тут уже не получится самопрекратить короутин (у меня Unity ругался поэтому я пишу названия в двойный кавычках) } } если сможете, то можете поправить и указать причину ошибки StopCoroutine(SpawnCoroutine()) |
Ответ: Сопрограммы (Coroutine) в Unity
Цитата:
|
Ответ: Сопрограммы (Coroutine) в Unity
всех нюансов ещё не знаю :ok:
теперь нашёл Возможные прерывания выполнения кода: но в коде не видел... и уточню - почему не сделать просто: yield break; а то уже хотел: break; писать =) |
Ответ: Сопрограммы (Coroutine) в Unity
Тут вот третий пост показывает, как остановить корутину, которая принимает IEnumerator:
http://forum.unity3d.com/threads/how...erator.249732/ Цитата:
|
Часовой пояс GMT +4, время: 09:10. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot