Coroutines — это функции, которые могут выполняться параллельно с основным циклом выполнения игры...
Видеоверсия этого руководства в настоящее время недоступна на этом языке.
Текстовая расшифровка видео
Всем привет!
Добро пожаловать в этот базовый урок по использованию Coroutines в Unity.
Coroutines — это функции, которые могут выполняться параллельно с основным циклом выполнения игры.
В этом уроке я использую практический пример, чтобы объяснить саму концепцию, а также познакомлю вас с функцией WaitForSeconds, которая позволяет приостановить выполнение операции на указанное количество секунд.
Этот урок предполагает, что у вас есть базовое понимание программирования на C# в Unity. Он был записан с использованием версии Unity 2022, однако Coroutines доступны во многих языках программирования и в предыдущих версиях Unity.
Наша цель — сделать так, чтобы пушка автоматически выпускала Prefab ядра, простую чёрную сферу, каждые 3 секунды до тех пор, пока не произойдёт внешнее событие, которое прервёт этот процесс.

В данном случае внешним событием будет нажатие пользователем клавиши S, что означает Stop.
Для начала нам нужно создать скрипт для пушки и назвать его «autoshoot».
Внутри основного класса я определяю три переменные, чтобы задать начальную точку появления ядра относительно пушки:
public GameObject spawnPrefab;
В Unity Editor я привяжу prefab ядра к этой публичной переменной.
Vector3 spawnPosition;
Quaternion spawnRotation;
Я заранее вычислил эту точку и начальную ориентацию, поэтому инициализирую эти два значения внутри функции Start:
spawnPosition = transform.position + new Vector3(-1.2f, 1.8f, 0f);
spawnRotation = Quaternion.Euler(-10f, -90f, 0f);


Очевидно, что нам нужно реализовать цикл, который будет повторяться бесконечно, если только внешнее событие не прервёт его, и который включает инструкцию задержки на 3 секунды перед переходом к следующей итерации.
ПРИМЕЧАНИЕ: prefab ядра содержит собственный скрипт, который при запуске придаёт шару начальный импульс вперёд и устанавливает автоматическое уничтожение объекта через 3 секунды, чтобы не заполнять ни виртуальное пространство, ни память системы ядрами.
Инструкция WaitForSeconds позволяет приостановить выполнение на заданное время, в нашем случае на 3 секунды.
Теперь нам нужно создать блок WHILE для выполнения основного цикла, который я сейчас пишу в пустом месте скрипта:
while(true) {
GameObject cannonBall = Instantiate(spawnPrefab, spawnPosition, spawnRotation, null);
yield return new WaitForSeconds(3);
}
Итак, где следует разместить этот блок WHILE?
Его нельзя поместить в Start, поскольку там нельзя использовать yield WaitForSeconds. Кроме того, размещение в Update не даст задержки, так как Update вызывается на каждом кадре игры.
Следовательно, нам нужно создать функцию с именем «shoot», которая возвращает тип IEnumerator и содержит блок WHILE.
Эта функция позволит нам запустить Coroutine с помощью инструкции StartCoroutine, передав имя функции в двойных кавычках в качестве параметра.
Поскольку пушка должна начать стрелять немедленно, мы пишем:
StartCoroutine("shoot");
внутри Start сразу после инициализации spawnPosition и spawnRotation.
Сохраним скрипт и перейдём в редактор, чтобы протестировать определённый на данный момент код.
Чтобы иметь возможность останавливать или перезапускать Coroutine, вернёмся к скрипту и добавим два оператора.

Мы можем остановить Coroutine, проверив, нажата ли клавиша S, и затем вызвав функцию StopCoroutine с Coroutine «shoot» в качестве параметра.
Аналогично мы можем перезапустить Coroutine, проверив, нажата ли клавиша R, и вызвав функцию StartCoroutine с параметром «shoot».
Итак, запишем в Update:
if(Input.GetKeyDown(KeyCode.S)) StopCoroutine("shoot");
if(Input.GetKeyDown(KeyCode.R)) StartCoroutine("shoot");

После добавления этих операторов сохраним скрипт и вернёмся в Unity Editor, чтобы протестировать его.
На этом всё для этого короткого урока. Надеюсь, он был для вас полезен. До скорой встречи!