Перейти к основному содержимому

События

Событие — это одна фраза: когда случится вот это, сделай вот то.

КОГДА  кто-то нажимает на дверь
ТОГДА проиграть скрип
распахнуть её за 600 мс
выключить табличку «заперто»

Когда — это триггер. Тогда — список шагов. Вот и вся идея, и она покрывает удивительно большую часть того, что нужно проекту.

На объекте может быть сколько угодно событий, и каждое работает независимо.

Здесь приведены названия, которые вы видите в редакторе

Если вы ещё пишете скрипты или собираете патчи, у каждого есть и короткое кодовое имя — справочники триггеров и шагов показывают оба рядом. Собирая в редакторе, оно вам не нужно.

Два сгенерированных списка, которые стоит держать открытыми

Все триггеры, на которые можно реагировать: триггеры. Все действия, которые можно совершить: шаги. Оба берутся прямо из движка, так что они никогда не устаревают.

Все триггеры и для чего они

В сгенерированном справочнике триггеров есть параметры каждого. Здесь — что они значат и где удивляют.

Ввод

В редактореСрабатывает, когда
Mouse buttonнажатие или клик — ветви для клика, нажатия и отпускания
Hoverкурсор входит на объект или уходит с него
Double clickдва клика по одному объекту в пределах 300 мс
Long pressудержание 450 мс без движения
Keyклавиша — ветви для нажатия и отпускания
Scrollкрутится колесо; можно фильтровать по направлению
Dragразмещённый AR-контент перетаскивают
Pinchразмещённый AR-контент масштабируют щипком
Rotateразмещённый AR-контент крутят

Три жестовых триггера существуют только на сценах surface — они про контент, который поставил посетитель. Они срабатывают непрерывно, пока палец движется, так что относитесь к ним как к потоку, а не к одному моменту.

Жизненный цикл

В редактореСрабатывает, когда
Launchсцена стартовала — доходит до каждого объекта
Resizeокно или вьюпорт сменил размер
Pauseприложение или вкладка ушли в фон
Resumeвернулись
on-pause — место, где вежливо всё останавливают

Звуки продолжают играть, когда посетитель переключается на другое приложение, если их не остановить. Пауза аудио и таймеров на on-pause и восстановление на on-resume — мелочь, которую люди замечают.

Трекинг

В редактореСрабатывает, когда
Detectмаркер или поверхность найдены
Tracking lostтрекинг потерян
Placedпосетитель разместил контент
VPS readyпозиционирование запустилось
VPS localizedреальное положение посетителя найдено
VPS localization failedне найдено — это нормально, а не ошибка
VPS errorпозиционирование вообще не смогло работать

Каждый предлагается только на сценах, чей якорь может его породить. Обнаружение сообщается по фронту, когда трекинг начинается, а не каждый кадр.

Промах VPS-локализации — ожидаемое дело

on-vps-not-localized срабатывает буднично, пока посетитель ходит в поисках места, которое карта узнает. Относитесь к нему как к «продолжай пробовать», а не как к провалу, о котором надо объявить.

Время и близость

В редактореСрабатывает, когда
Delayодин раз, после задержки
Every N secondsмногократно — число повторов 0 означает бесконечно
Distanceчто-то приблизилось или ушло — две ветви
Visibilityобъект показали или скрыли
Variable changeзначение переменной изменилось

У on-distance есть опция «проверить на старте». Без неё объект, который уже рядом при открытии сцены, не сработает, пока что-нибудь не сдвинется.

Состояния, физика и интерфейс

В редактореСрабатывает, когда
State activeэтот объект вошёл в выбранное вами состояние
State inactiveвышел из него
Collisionобъект коснулся другого — при желании только определённых
UI actionнажата кнопка на карточке интерфейса
Signalдругое событие отправило сигнал
Game controlsперсонаж сменил состояние

Одно событие, оба направления

У некоторых триггеров есть ветви, так что одно событие обрабатывает все исходы. Задайте дистанцию один раз и ответьте и на приближение, и на уход:

ТриггерВетви
Distanceвошёл · вышел
Keyнажата · отпущена
Hoverвошёл · вышел
Mouseклик · нажата · отпущена
Visibilityпоказан · скрыт
Game controlпростой · движение · прыжок · бег

В редакторе на каждую ветвь отводится свой раздел. У триггеров без ветвей раздел один — «при срабатывании».

На какие объекты действует шаг

У каждого шага есть цели.

Оставьте их пустыми — шаг подействует на объект с событием (обычный случай). Заполните — на указанные объекты; так одно событие на кнопке открывает три двери.

Нажатия поднимаются к родителям

Нажатие, наведение или действие карточки доходят до объекта и его родителей.

Это избавляет от массы повторов: одно событие на группе ловит нажатия по всему, что внутри, вместо копирования одного и того же события на сорок объектов.

Два приятных побочных эффекта:

  • «нажатие где угодно в этой панели» — одно событие на панели;
  • переход между двумя детьми одного родителя не вызывает у родителя hover/blur, потому что вы его на самом деле не покидали.

Столкновения — исключение: они срабатывают только там, где произошли. А клавиатура, прокрутка, изменение размера и старт сцены не относятся ни к одному объекту, поэтому доходят до всего.

Несколько клавиш на одно событие

Прыжок по Space или W — это одно событие, а не две копии. Первая комбинация живёт в триггере, остальные — в списке «или», записанном текстом:

ArrowUp        ctrl+KeyW        KeyA+KeyS        Space+double

Модификаторы принадлежат той комбинации, в которой записаны, а альтернатива заменяет привязку, а не добавляется к ней. Кнопки мыши записываются так же (mouse:middle).

А ещё лучше — указать привязку проекта, а не клавишу. Переназначьте «прыжок» один раз в настройках проекта, и все события, которые его упоминают, переедут вместе с ним, — а именно это и нужно в день, когда кто-то попросит управление для левшей.

Все шаги и что они делают

Параметры — в сгенерированном справочнике шагов.

Навигация и внешний мир

В редактореЧто делает
Scene transitionперейти к другой сцене
Space transitionперейти к другому space, при желании к конкретной сцене
Open URLоткрыть ссылку, в этой вкладке или новой
Open messengerFacebook, VK, OK, Instagram, Telegram, WhatsApp или Viber
Call phone numberначать звонок
Compose emailначать письмо
File downloadскачать файл из вашего проекта
Contact downloadпредложить визитку, собранную из заполненных вами полей

Шаг мессенджера принимает id страницы для Facebook, VK и OK, имя пользователя для Instagram и Telegram и номер телефона для WhatsApp и Viber.

Изменение сцены

В редактореЧто делает
Show / hide objectпоказать или скрыть цели — на сцене это её активирует
Set stateпереключиться в именованное состояние, при желании плавно
Override propertiesприменить разовый набор значений как временное состояние

Анимация

В редактореЧто делает
Play animationпроиграть пресет таймлайна — режим повтора, повторы, скорость, задержка
Stop animationостановить его
Transformationдвигать, вращать или масштабировать со временем
Opacityрастворение
Materialподмешать к материалам целей сохранённый материал
Bone transformдвигать отдельную кость
Built-in animationпроиграть клип, приехавший с моделью

Play animation может запустить анимацию любого объекта, а не только того, на котором висит событие, — так одна кнопка запускает последовательность сразу из нескольких вещей.

Движение

В редактореЧто делает
Follow objectнепрерывно следовать — дистанция, смещение, сглаживание и скорость
Look at objectповернуться к чему-то, не двигаясь
Stop followingостановить и то и другое
Fly along pathдвигаться по пути
Stop path flightостановить это

Логика

В редактореЧто делает
If — otherwiseпроверить условие и выполнить один из двух вложенных списков шагов
Set variableзадать, прибавить или переключить переменную
Send signalотправить сигнал — целям или всем
Wait, thenподождать, прежде чем выполнить вложенные шаги

Курсор

Lock pointer и Release pointer прячут курсор мыши и передают его движение вашей сцене — то, что нужно игре от первого лица, чтобы курсор не уезжал за пределы окна.

Условия

if_action — это шаг, а не свойство события, поэтому условия вкладываются, и «если внутри если» — это способ получить больше двух исходов.

На что смотрит условие, задаёт его источник:

ИсточникЧто проверяетЧем
alwaysничего — всегда истина
variableзначение переменнойпеременная, оператор, значение
distanceнасколько объект события далёк от другогоцель, оператор, порог
stateв каком состоянии другой объектцель, состояние
visibleвиден ли кто-тоцель, флаг
randomвероятностьпорог, в процентах

Значения читаются вольно: 3 становится числом, true — логическим, всё остальное остаётся текстом. == и != сравнивают точно, остальные операторы сравнивают как числа.

Переменные, сигналы и таймеры

Переменные живут в рамках визита, а не проекта: каждый раз, когда кто-то открывает ваш проект, они пустые. Задавайте им стартовые значения событием на запуск сцены. Это те же самые переменные, которые скрипт видит как глобальные.

Сигналы (emit_signalon-signal) связывают события без копирования шагов: несколько событий слушают level-complete, а отправить его может что угодно. Сигнал, переотправляющий сам себя, останавливается после восьми кругов, а не подвешивает кадр.

Таймеры запускаются, когда их объект оживает, и сбрасываются, когда его выключают. Повторное включение начинает отсчёт заново, а не выпускает очередь пропущенных тиков.

Состояния

Состояние — именованный снимок настроек объекта: позиция, цвет, видимость, что угодно. Переключение на состояние применяет снимок, а переключение с длительностью делает это плавно.

Состояния — аккуратный способ сделать выключатель, подсветку, дверь в положении «открыта / закрыта», не анимируя ничего руками.

Пока состояние выбрано, ваши правки уходят в него

Меняя объект при активном состоянии, вы редактируете снимок этого состояния, а не объект. Это ровно то, что нужно при сборке состояний, и изрядная путаница, когда вы не заметили, что состояние выбрано.

Повторный трекинг

Для AR-сцен режим повторного трекинга у каждого события решает, что произойдёт, когда маркер потерян и найден снова: начать заново сразу, не перезапускать вовсе или перезапустить после того, как текущие шаги отработают.

Если вы ещё и пишете скрипты

События, патчи и скрипты делят один словарь: одно и то же нажатие доходит до всех троих.

Обрабатывайте каждый триггер только в одном месте

Один и тот же триггер на одном объекте, заведённый и событием, и скриптом, выполнится дважды. Если что-то срабатывает дважды — почти всегда причина в этом.


Дальше: Анимация — как заставить вещи двигаться.