Ваша первая корутина
Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 24 из 71.
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, а любое другое значение воспринимает как ожидание одного кадра.
Задание
ЛегкоЗаставь ловушку с шипами подпрыгнуть при нажатии пробела с помощью сопрограммы.
- Напиши
IEnumerator Spring(): выведи в журналClick, затемyield return new WaitForSeconds(0.5f);, а после этого —transform.position += Vector3.up;. - Затем подожди таким же способом 2 секунды и снова вычти
Vector3.up. - В
ifдля пробела запусти сопрограмму с помощьюStartCoroutine(Spring());.
Нажми «Играть» и нажми пробел: шипы подпрыгнут, а затем опустятся. После этого нажми «Проверить».
Попробуйте сами
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Ваша первая корутинаЦиклы в корутинахОстановка корутинПовторение: обратный отсчёт10Проект: Побег с арены
АренаОхотники2Столкновения
OnCollisionEnterВо что я попал?Разрушение при столкновенииСтояние на землеОтскок и трениеФормы коллайдеровПовторение: разрушаемая стена5Проект: Монетная гонка
Катящийся шарСобираем монетыПотренируйтесь самостоятельно: Песочница Unity