Где живёт скрипт
Один и тот же скрипт ведёт себя по-разному в зависимости от того, к чему вы его прикрепили. Выбор уровня обычно важнее самого кода.
| Прикреплён к | Работает, пока | Умирает, когда |
|---|---|---|
| Объекту | этот объект на экране | его скрыли, выключили или удалили |
| Сцене | эта сцена активна | сцену покинули |
| Space | посетитель в этом space | он перешёл в другой space |
| Проекту | всегда, в любом space | он ушёл |
На объекте
Вариант по умолчанию и правильный выбор для поведения, принадлежащего вещи: дверь, которая открывается, враг, который преследует, кнопка, которая реагирует.
Его ctx.entity — это тот самый объект, и скрипт останавливается в тот же миг, что и объект, — и
это фича. Вам никогда не приходится прибираться за скриптом объекта, которого больше нет.
На сцене
Добавляется в разделе Scripts у сцены. Используйте для логики о сцене целиком: поставить вступление, посчитать, сколько собираемых предметов осталось, решить, когда посетителю можно двигаться дальше.
Он запускается, когда сцена становится активной, и останавливается вместе с ней — так что в AR-проекте он стартует по обнаружению маркера.
На space
Добавляется в разделе Scripts у space. Этот переживает смену сцен, и в этом весь смысл: счёт, который переносится через три сцены, таймер на весь визит, контроллер, решающий, какая сцена следующая.
Сущность с поведением и без родителя не принадлежит ни одной сцене. Она продолжает работать, пока сцены сменяются, и всякое адресованное событие в конце концов до неё доходит: маршрут — объект, затем сцена, затем space.
На проекте
Добавляется в настройках проекта. Внедряется в каждый space, поэтому есть везде, куда бы посетитель ни пошёл.
Тянитесь к этому, когда что-то должно пережить переход между spaces: выборы посетителя, общий счётчик прогресса, аналитика.
Что что переживает
| Хранится в | Смену сцены | Смену space | Перезагрузку |
|---|---|---|---|
переменной в init | если жив сам скрипт | если жив сам скрипт | нет |
ctx.store | да | нет | нет |
| глобальном значении | да | да | нет |
глобальном @space: | да | нет — намеренно изолировано | нет |
Ни store, ни глобальные значения, ничего. Если значение должно быть на месте в следующий раз,
отправьте его куда-то к себе, пока посетитель ещё на странице.
Как выбрать, один вопрос
Что самое маленькое, о чём эта логика?
- об одном объекте → кладите на объект;
- об этой сцене → кладите на сцену;
- обо всём визите → кладите на space, а если spaces несколько — на проект.
Класть всё на уровень проекта «на всякий случай» работает, а потом перестаёт: скрипт проекта не может предполагать, что загружена какая-то конкретная сцена, и в итоге обрастает проверками существования, которые скрипту на объекте никогда бы не понадобились.
Патчи подчиняются тому же правилу
Патч тоже можно прикрепить на любом из этих уровней, с теми же сроками жизни. Патч уровня проекта — обычный способ собрать глобальный контроллер, не написав кода.
Дальше: API ctx