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

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

Поиск по учебным материалам

Введите фразу или несколько ключевых слов через запятую.

Это личный сайт, и он не является каналом продаж. На страницах, посвящённых 3D-моделям, представлена информация о некоторых моих работах; они не содержат предложений, цен, способов приобретения или коммерческих ссылок. В настоящее время я не принимаю заказы на индивидуальные работы, консультации или иные формы профессионального сотрудничества.


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