Menu
CoddyTech

Ваша первая корутина

Часть раздела Физика и игровой процесс путешествия по 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, а любое другое значение воспринимает как ожидание одного кадра.

challenge icon

Задание

Легко

Шипы ждут под полом. Заставь пробел привести ловушку в действие с помощью корутины с именем 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 единицу
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Физика и игровой процесс