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

Где живёт скрипт

Один и тот же скрипт ведёт себя по-разному в зависимости от того, к чему вы его прикрепили. Выбор уровня обычно важнее самого кода.

Прикреплён кРаботает, покаУмирает, когда
Объектуэтот объект на экранеего скрыли, выключили или удалили
Сценеэта сцена активнасцену покинули
Spaceпосетитель в этом spaceон перешёл в другой space
Проектувсегда, в любом spaceон ушёл

На объекте

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

Его ctx.entity — это тот самый объект, и скрипт останавливается в тот же миг, что и объект, — и это фича. Вам никогда не приходится прибираться за скриптом объекта, которого больше нет.

На сцене

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

Он запускается, когда сцена становится активной, и останавливается вместе с ней — так что в AR-проекте он стартует по обнаружению маркера.

На space

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

Вот что технически означает «уровень space»

Сущность с поведением и без родителя не принадлежит ни одной сцене. Она продолжает работать, пока сцены сменяются, и всякое адресованное событие в конце концов до неё доходит: маршрут — объект, затем сцена, затем space.

На проекте

Добавляется в настройках проекта. Внедряется в каждый space, поэтому есть везде, куда бы посетитель ни пошёл.

Тянитесь к этому, когда что-то должно пережить переход между spaces: выборы посетителя, общий счётчик прогресса, аналитика.

Что что переживает

Хранится вСмену сценыСмену spaceПерезагрузку
переменной в initесли жив сам скриптесли жив сам скриптнет
ctx.storeданетнет
глобальном значениидаданет
глобальном @space:данет — намеренно изолированонет
Закрытие вкладки не переживает ничто

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

Как выбрать, один вопрос

Что самое маленькое, о чём эта логика?

  • об одном объекте → кладите на объект;
  • об этой сцене → кладите на сцену;
  • обо всём визите → кладите на space, а если spaces несколько — на проект.

Класть всё на уровень проекта «на всякий случай» работает, а потом перестаёт: скрипт проекта не может предполагать, что загружена какая-то конкретная сцена, и в итоге обрастает проверками существования, которые скрипту на объекте никогда бы не понадобились.

Патчи подчиняются тому же правилу

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


Дальше: API ctx