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, чтобы протестировать его.

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

Этот сайт предназначен исключительно для демонстрации некоторых моих работ и не имеет рекламных целей. Обратите внимание, что в настоящее время я не ищу и не рассматриваю запросы на индивидуальные заказы, консультации или любые другие формы профессионального сотрудничества.


РАСШИРЕННАЯ ИНФОРМАЦИЯ О ПОЛИТИКЕ КОНФИДЕНЦИАЛЬНОСТИ И ИСПОЛЬЗОВАНИИ ФАЙЛОВ COOKIE