Menu
CoddyTech

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

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

challenge icon

Задание

Легко

Заставь ловушку с шипами подпрыгнуть при нажатии пробела с помощью сопрограммы.

  1. Напиши IEnumerator Spring(): выведи в журнал Click, затем yield return new WaitForSeconds(0.5f);, а после этого — transform.position += Vector3.up;.
  2. Затем подожди таким же способом 2 секунды и снова вычти Vector3.up.
  3. В 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 единицу
}

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

Потренируйтесь самостоятельно: Песочница Unity