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

Загрузка и стартовый экран

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

Три способа, которыми приезжает ассет

Что происходитДля чего хорошо
Preloadedзагружается до открытия сцены; стартовый экран его ждётвсё, что видно в первые секунды
Deferredсцена открывается без него; он появляется, когда приедетконтент из глубины проекта
Streamedпроигрывается прямо из сети, целиком не загружаетсявидео и аудио
Отложенная загрузка — это не стриминг

Начать проигрываться до полного приезда могут только видео и аудио. Модель, текстура или шрифт всё равно должны приехать целиком, прежде чем ими можно будет пользоваться; отложить их означает лишь, что сцена откроется не дожидаясь, а ассет появится, когда будет готов.

Умолчание проекта и переопределения у ассетов

Настройка проекта Preload — это умолчание для всего. Каждый ассет может её переопределить:

Ассет говоритРезультат
preload onвсегда ждём, что бы ни говорил проект
preload offвсегда откладываем
inheritследует настройке проекта

Новые ассеты стартуют разумно: видео и аудио по умолчанию стримятся — ждать целое видео перед открытием сцены бессмысленно, — а всё остальное следует проекту.

Выбор принадлежит ассету, а не объекту, который его использует

Два объекта, делящих один файл, больше не могут разойтись во мнениях о том, как он грузится. Задайте один раз на файле.

Практический рецепт

Для большинства проектов:

  1. Preload для моделей первой сцены, её текстур и любого шрифта, который показывается сразу.
  2. Defer для всего, что принадлежит поздним сценам.
  3. Stream для всего видео и аудио — это и так по умолчанию.

В результате получается короткое ожидание, после которого проект больше никогда не подвисает.

Стартовый экран

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

Оба настраиваются в настройках проекта — фон, логотип, кнопка старта и её подпись, подсказки онбординга, вид лоадера.

Оставляйте кнопку старта, если есть хоть какой-то звук

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

Как заменить его своим

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

init((ctx: PreloadContext) => {
// Объявляем панель. Выполняется до любой отрисовки — только объявляем, ничего не рисуем.
ctx.on('describe', (p) => {
p.section('look', { en: 'Look' });
p.color('tint', { label: { en: 'Background' }, default: '#101014', section: 'look' });
p.text('caption', { label: { en: 'Caption' }, default: '', localized: true, section: 'look' });
p.boolean('hideWhenReady', { label: { en: 'Hide when ready' }, default: true });
});

ctx.on('launch', () => {
/* экран, который нажимают, чтобы начать */
});

ctx.on('loading', () => {
/* экран, который заполняется */
});

ctx.on('progress', ({ loaded, total, percent }) => {
/* обновляем свою полоску */
});

ctx.on('ready', () => {
/* всё приехало */
});
});
СобытиеСрабатывает, когда
describeстроится панель — и в рантайме, и в редакторе одинаково
startрантайм запускается
launchпора показать экран, который нажимает посетитель
loadingпора показать экран, который заполняется
progressприезжают ассеты — loaded, total, percent
readyвсё необходимое приехало
errorчто-то пошло не так

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

Запускайте сцену изнутри нажатия

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

Сломанный скрипт запуска не запрёт посетителей снаружи

Если он бросит исключение, рантайм откажется от пресета и покажет встроенный экран.

Что не ждёт

Физика вообще не скачивается, пока сцене не понадобится, а расстановка инстансов и частиц генерируется, а не передаётся. И то и другое разобрано в «Почему этот движок» — это части одной идеи: не заставлять людей ждать то, что им не нужно.


Дальше: Общие пакеты