Ваша первая корутина
Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 23 из 63.
Update() должен завершаться каждый кадр, поэтому он не может ждать. Это может корутина: метод, который приостанавливается, а затем продолжает работу с того места, где остановился. Он возвращает IEnumerator, для которого требуется using System.Collections;, а каждый yield return в нём — это пауза. В C# yield return создаёт метод, который выдаёт значения по одному; Unity запрашивает следующее, когда ожидание заканчивается. yield return null ждёт один кадр, а yield return new WaitForSeconds(3f) ждёт 3 секунды.
StartCoroutine(Cycle()) запускает корутину. Этот светофор загорается зелёным, через 3 секунды — жёлтым, а ещё через секунду — красным:
using System.Collections;
using UnityEngine;
public class TrafficLight : MonoBehaviour
{
Renderer lamp;
void Start()
{
lamp = GetComponent<Renderer>();
StartCoroutine(Cycle());
}
IEnumerator Cycle()
{
lamp.material.color = Color.green;
yield return new WaitForSeconds(3f);
lamp.material.color = Color.yellow;
yield return new WaitForSeconds(1f);
lamp.material.color = Color.red;
}
}StartCoroutine сразу выполняет корутину до первого yield, после чего Start() продолжает работу; Unity возобновляет корутину после каждой паузы, сохраняя её локальные переменные в прежнем состоянии. Простая запись Cycle(); без StartCoroutine ничего не делает: она создаёт приостановленный метод и отбрасывает его, и ни одна его строка не выполняется. А yield return 3f; — это не ожидание в течение 3 секунд: Unity распознаёт только объекты ожидания, например WaitForSeconds, а любое другое значение воспринимает как ожидание одного кадра.
Задание
ЛегкоШипы ждут под полом. Заставь пробел привести ловушку в действие с помощью корутины с именем Spring:
- Сразу: выведи в журнал
Click. - Через полсекунды: шипы подпрыгивают вверх на 1 единицу.
- Ещё через 2 секунды: они опускаются обратно на 1 единицу.
Нажми Play, нажми пробел и наблюдай, затем нажми Check.
Попробуйте сами
using System.Collections;
using UnityEngine;
public class SpikeTrap : MonoBehaviour
{
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
// Активируйте ловушку с помощью сопрограммы
}
}
// IEnumerator Spring(): щелчок, подождать 0.5 s, подняться на 1 единицу, подождать 2 s, опуститься на 1 единицу
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Физика и игровой процесс
1Твёрдое тело
Гравитация и массаТолкаем с помощью AddForceПрыжок с импульсомFixedUpdate для физикиСкоростьКинематические телаПовторение: пусковая площадка4Корутины
InvokeInvokeRepeating, CancelInvokeВаша первая корутинаЦиклы в корутинахОстановка корутинПовторение: обратный отсчёт2Столкновения
OnCollisionEnterВо что я попал?Разрушение при столкновенииСтояние на землеОтскок и трениеФормы коллайдеровПовторение: разрушаемая стена5Проект: Погоня за монетами
Катящийся мячМонеты для сбора