События
Событие — это одна фраза: когда случится вот это, сделай вот то.
КОГДА кто-то нажимает на дверь
ТОГДА проиграть скрип
распахнуть её за 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 | позиционирование вообще не смогло работать |
Каждый предлагается только на сценах, чей якорь может его породить. Обнаружение сообщается по фронту, когда трекинг начинается, а не каждый кадр.
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 messenger | Facebook, 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_signal → on-signal) связывают события без копирования шагов: несколько
событий слушают level-complete, а отправить его может что угодно. Сигнал, переотправляющий сам
себя, останавливается после восьми кругов, а не подвешивает кадр.
Таймеры запускаются, когда их объект оживает, и сбрасываются, когда его выключают. Повторное включение начинает отсчёт заново, а не выпускает очередь пропущенных тиков.
Состояния
Состояние — именованный снимок настроек объекта: позиция, цвет, видимость, что угодно. Переключение на состояние применяет снимок, а переключение с длительностью делает это плавно.
Состояния — аккуратный способ сделать выключатель, подсветку, дверь в положении «открыта / закрыта», не анимируя ничего руками.
Меняя объект при активном состоянии, вы редактируете снимок этого состояния, а не объект. Это ровно то, что нужно при сборке состояний, и изрядная путаница, когда вы не заметили, что состояние выбрано.
Повторный трекинг
Для AR-сцен режим повторного трекинга у каждого события решает, что произойдёт, когда маркер потерян и найден снова: начать заново сразу, не перезапускать вовсе или перезапустить после того, как текущие шаги отработают.
Если вы ещё и пишете скрипты
События, патчи и скрипты делят один словарь: одно и то же нажатие доходит до всех троих.
Один и тот же триггер на одном объекте, заведённый и событием, и скриптом, выполнится дважды. Если что-то срабатывает дважды — почти всегда причина в этом.
Дальше: Анимация — как заставить вещи двигаться.