Манифест ресурсов06 / 12

Файл, URL и идентификатор ресурса

Свяжем файлы проекта с именами, которые использует игровой код.

Манифест перечисляет ресурсы игры. В нём у каждого ресурса есть id, тип и URL. Код использует стабильный идентификатор; Vite формирует адрес файла в сборке.

В assets.manifest.ts import.meta.glob собирает ссылки на файлы, а AssetManifestBuilder превращает их в наборы ресурсов. Запишем этот фрагмент с типом результата glob<string>:

const images = import.meta.glob<string>(
  '@game/assets/images/**/*.{png,jpg,jpeg,webp,avif}',
  { eager: true, query: '?url', import: 'default' },
);

Здесь eager: true получает URL сразу. Содержимое изображений при этом не загружается через AssetManager: запросы выполнятся при загрузке соответствующего набора.

01
game/assets/images/block.pngИсходный файл
02
images/block.pngAsset ID по стандартной стратегии после /assets/
03
importedUrlАдрес, подготовленный Vite
04
AssetManagerЗагруженное изображение по стабильному ID
Идентификатор остаётся понятным, даже если сборщик меняет имя выходного файла.

Небольшой набор можно собрать вручную:

const bundles = [{
  name: 'images',
  assets: [{ id: 'images/block.png', type: 'image', importedUrl: blockUrl }],
}] satisfies BundleDescriptor[];

blockUrl — адрес изображения, импортированного с ?url. Тип BundleDescriptor импортируем из @gamedevland/engine/assets. Когда файлов много, AssetManifestBuilder собирает наборы без ручного перечисления.

BundleBuildPolicy определяет группировку. Игра делит музыку и эффекты на audio-music и audio-sfx. Тип ресурса выбирает loader: image, audio, json или font. SDK сам подготавливает загруженное изображение для узла; создавать текстуру в каждом компоненте не нужно.

Источники ↗

Block Puzzle · assets.manifest.ts↗Полный манифест примера.