Menu
CoddyTech

InvokeRepeating, CancelInvoke

Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 22 из 63.

InvokeRepeating(nameof(Blink), 0.5f, 0.5f) вызывает Blink в первый раз через 0.5 секунды, а затем каждые 0.5 секунды, пока вызов не будет отменён. Первое число — задержка перед первым вызовом, второе — интервал между вызовами. CancelInvoke(nameof(Blink)) останавливает его, а CancelInvoke() без имени останавливает все вызовы Invoke, запланированные скриптом.

Эта сигнальная лампа мигает, пока не будет нажата клавиша Space, после чего остаётся включённой:

Light lamp;

void Start()
{
    lamp = GetComponent<Light>();
    InvokeRepeating(nameof(Blink), 0.5f, 0.5f);
}

void Blink()
{
    lamp.enabled = !lamp.enabled;
}

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        CancelInvoke(nameof(Blink));
        lamp.enabled = true;
    }
}

Таймер из главы о создании объектов выполнял бы ту же задачу с полем типа float и проверкой в Update(). При использовании InvokeRepeating Unity сама отслеживает время и выполняет вызовы. Вызов InvokeRepeating нужно поместить в Start(): если поместить его в Update(), на каждом кадре будет запланирован ещё один повторяющийся вызов.

challenge icon

Задание

Легко

Гейзер подбрасывает находящийся на нём мяч в воздух. В его скрипте есть ball, power и счётчик eruptions. Настройте извержения по расписанию:

  • Первое извержение происходит через 1 секунду после нажатия Play, затем — каждые 2 секунды.
  • Извержение — это метод с именем Erupt: он увеличивает eruptions на 1, толкает мяч вверх с помощью ball.AddForce(Vector3.up * power, ForceMode.Impulse) и выводит в журнал Eruption 1, Eruption 2 и так далее.
  • После третьего извержения гейзер останавливается навсегда.

Нажмите Play и проследите за мячом, затем нажмите Check.

Попробуйте сами

using UnityEngine;

public class Geyser : MonoBehaviour
{
    public Rigidbody ball;
    public float power = 6f;
    int eruptions;

    void Start()
    {
        // Выполнить извержение через 1 секунду после Play, затем каждые 2 секунды
    }

    // Erupt(): подсчитать извержения, подбросить шар вверх, вывести сообщение в журнал; остановиться после третьего извержения
}
quiz iconПроверьте себя

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

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