Загрузка и стартовый экран
Посетитель ждёт один раз — в начале. А вот чего именно он ждёт, решаете вы, и это самый сильный рычаг влияния на то, каким ощущается открытие проекта.
Три способа, которыми приезжает ассет
| Что происходит | Для чего хорошо | |
|---|---|---|
| Preloaded | загружается до открытия сцены; стартовый экран его ждёт | всё, что видно в первые секунды |
| Deferred | сцена открывается без него; он появляется, когда приедет | контент из глубины проекта |
| Streamed | проигрывается прямо из сети, целиком не загружается | видео и аудио |
Начать проигрываться до полного приезда могут только видео и аудио. Модель, текстура или шрифт всё равно должны приехать целиком, прежде чем ими можно будет пользоваться; отложить их означает лишь, что сцена откроется не дожидаясь, а ассет появится, когда будет готов.
Умолчание проекта и переопределения у ассетов
Настройка проекта Preload — это умолчание для всего. Каждый ассет может её переопределить:
| Ассет говорит | Результат |
|---|---|
| preload on | всегда ждём, что бы ни говорил проект |
| preload off | всегда откладываем |
| inherit | следует настройке проекта |
Новые ассеты стартуют разумно: видео и аудио по умолчанию стримятся — ждать целое видео перед открытием сцены бессмысленно, — а всё остальное следует проекту.
Два объекта, делящих один файл, больше не могут разойтись во мнениях о том, как он грузится. Задайте один раз на файле.
Практический рецепт
Для большинства проектов:
- Preload для моделей первой сцены, её текстур и любого шрифта, который показывается сразу.
- Defer для всего, что принадлежит поздним сценам.
- 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 | что-то пошло не так |
Параметры могут быть локализованными, так что один скрипт запуска обслуживает все языки вашего проекта.
То, чем вы начинаете, должно вызываться прямо из обработчика клика по кнопке. Разрешения — на ориентацию устройства, на камеру — выдаются только внутри жеста, который их запросил, а старт, отложенный до следующего кадра, это право теряет.
Если он бросит исключение, рантайм откажется от пресета и покажет встроенный экран.
Что не ждёт
Физика вообще не скачивается, пока сцене не понадобится, а расстановка инстансов и частиц генерируется, а не передаётся. И то и другое разобрано в «Почему этот движок» — это части одной идеи: не заставлять людей ждать то, что им не нужно.
Дальше: Общие пакеты