Ссылка на формат файла AssetBundle
Когда вы используете BuildPipeline.BuildAssetBundles до построить AssetBundles, Unity записывает следующие файлы в указанный каталог выходных данных:
Примечание: Если вы используете Addressables пакет построить AssetBundles, он производит AssetBundle файл, но нет файлов манифестов или пакетов манифестов.
Unity формат архивного файла
Архивный файловый формат Unity является общим форматом упаковки, который может хранить любой тип файла, подобно файлу .zip. Архивные файлы подключены в виртуальную файловую систему Unity (VFS), что позволяет им быть доступными единообразным образом на различных платформах.
Unity использует архивный формат для AssetBundles, где архивные файлы создаются как заключительная стадия AssetBundle процесс сборки. Они монтируются в виртуальную файловую систему Unity, когда AssetBundle загружен. Формат архива также используется для проигрывателей, созданных с помощью сжатия LZ4, в этом случае архив монтируется автоматически при запуске проигрывателя.
Обычно вам не нужно взаимодействовать с архивами на низком уровне. Однако Unity предоставляет API ArchiveFileInterface для управления архивными файлами непосредственно с низкоуровневым APIs по мере необходимости.
AssetBundle файлы
Файл AssetBundle представляет собой архивный файл, содержащий несколько файлов, из которых ассеты загружаются во время выполнения. На следующей схеме показан пример структуры файла AssetBundle:
- Он содержит ряд вложенных контейнеров, где самый внешний является экземпляром архивной файловой системы с тем же именем, что и AssetBundle.
- В этом примере
ArchiveFileSystemфайл архива содержит два файла:- Главный файл AssetBundle, в формате серийного файла Unity. Этот файл содержит объект
AssetBundleи объекты из всех ассетов, включенных в AssetBundle. - Один или несколько аудиоклипов, хранящихся в файле с расширением
.resource.
- Главный файл AssetBundle, в формате серийного файла Unity. Этот файл содержит объект
Способ, которым Unity организует содержимое внутри AssetBundle, называется макетом сборки. Макет сборки зависит от того, содержит ли AssetBundle ассеты или сцены:
- Asset AssetBundles: Содержит все объекты из ассетов в одном серийном файле внутри архивного файла Unity. Он также содержит все объекты, на которые ссылаются эти ассеты, если только другой AssetBundle не раскрывает ассет, на который сделана ссылка. Один и тот же объект, на который сделана ссылка, может быть дублирован в нескольких AssetBundles.
- Scene AssetBundles: Имеет схожий макет для сборки Игрок. Каждая сцена имеет сериализированный файл с объектами из этой сцены, с именем файла вроде
PlayerBuild-SceneFileName. Это соответствует файламlevel0в сборке Player. Unity хранит ассеты, на которые делается ссылка из файла сцены в файлеsharedasset, напримерPlayerBuild-SceneFileName.sharedasset, если только другой AssetBundle не выставляет ассет, на который делается ссылка. Поскольку расчетыsharedassetохватывают только сцены, которые находятся в одном и том же AssetBundle, если сцены хранятся в отдельных AssetBundles, а не хранятся вместе в одном AssetBundle, то Unity может создать значительное количество дублирующихся объектов. Тем не менее, хранение сцен в отдельных AssetBundles может иметь преимущества с точки зрения производительности и распределения.
Конвенция именования для серийного файла внутри архива выглядит следующим образом:
- Ассет AssetBundles именует серийизованный файл как
CAB-, за которым следует хэш MD4 имени AssetBundle. Например,CAB-cc6c60ef8808e0fc6663136604321554. - Scene AssetBundles созданные с
BuildPipeline.BuildAssetBundlesиспользуют имя, начинающееся сPlayerBuild-, за которым следует имя файла сцены (без пути и расширения). Например,Assets/Scene1.unityстановитсяPlayerBuild-Scene1. Из-за этого соглашения дайте каждому файлу сцены уникальное имя файла, чтобы избежать конфликтов. - Scene AssetBundles создан Addressables именует каждый файл сериализированной сцены как
CAB-, за которым следует хэш MD4 относительного пути сцены к проекту. Сопровождающий файлsharedassetимеет то же имя файла, за которым следует расширение.sharedasset.
Как и в сборках Player, каждый сериализированный файл внутри AssetBundle может сопровождаться файлами .resS и .resource для хранения больших двоичных данных. Все аудио или видео сохраняется в файлах .resource, а текстуры и меши сохраняются в формате .resS. Эти файлы именуются по сопровождающему их сериализированному файлу, например CAB-cc6c60ef8808e0fc6663136604321554.resource или PlayerBuild-Scene1.sharedasset.resS.
Изучение содержимого файла AssetBundle
Установка Unity Editor включает в себя исполняемые файлы WebExtract и Binary2Text, которые можно использовать для извлечения файлов, вложенных внутри AssetBundle, и создания текстового дампа содержимого двоичного файла SerializedFile. Его вывод похож на формат YAML, используемый Unity.
Более подробную информацию об этих инструментах см. в Анализ AssetBundles.
Файлы манифестов
Для каждого генерируемого AssetBundle, Unity генерирует соответствующий файл манифеста. Файл манифеста имеет расширение .manifest и может быть открыт любым текстовым редактором.
Он включает в себя следующее:
- Хеш, необходимый для расчетов построения и проверки содержимого. Дополнительные сведения см. в
BuildPipeline.GetHashForAssetBundle. - Проверка циклической избыточности (CRC). Вы можете получить эту информацию с
BuildPipeline.GetCRCForAssetBundle. - Список сцен или ассетов в AssetBundle.
- Список любых AssetBundles, от которых зависит AssetBundle, в качестве абсолютных путей.
- Информация об использовании типов, используемая для удаления типов. Сюда входит использование объектов Unity, производных классов MonoBehaviour и ScriptableObject и типов
SerializeReference. Дополнительные сведения см. вBuildPlayerOptions.assetBundleManifestPath.
Ниже приведен пример содержимого файла манифеста AssetBundle:
ManifestFileVersion: 0
UnityVersion: 6000.2.0a6
CRC: 4208470199
Compression: None
Hashes:
AssetFileHash:
serializedVersion: 2
Hash: 81197c4674c1f389b3568a0aa1b41119
TypeTreeHash:
serializedVersion: 2
Hash: 3c2131fb3360d17991621f547033218e
IncrementalBuildHash:
serializedVersion: 2
Hash: 489e266cfc1b361a94c3efc39afecb54
HashAppended: 0
ClassTypes:
- Class: 1
Script: {instanceID: 0}
- Class: 4
Script: {instanceID: 0}
SerializeReferenceClassIdentifiers: []
Assets:
- Assets/Scenes/Scene2.unity
- Assets/Scenes/SampleScene.unity
Dependencies:
- C:/MyBuild/audio.bundle
- C:/MyBuild/sprites.bundle
Unity использует .manifest файлы для ее Конвейер построения. При выполнении сборки Unity проверяет существующие AssetBundles и .manifest файлов для определения того, AssetBundle необходимо восстановить или может быть использован повторно. Если вы удалите .manifest файлы тогда Unity всегда восстанавливает AssetBundles с нуля.
Файлы манифестов не требуются для загрузки файла AssetBundles, так что вам не нужно их распространять. Если используется BuildAssetBundleOptions.AppendHashToAssetBundleName, хэш добавляется к имени файла AssetBundle, но этот хэш не включается в имя файла .manifest.
Корневой файл манифеста
В дополнение к файлу .manifest для каждого AssetBundle, Unity генерирует корневой манифест .manifest, названный по имени самой папки сборки (например, MyBuildFolder.manifest). В этом файле перечислены сгенерированные AssetBundles и их зависимости, с путями относительно каталога сборки. Он также содержит CRC манифеста AssetBundle. Этот корневой манифест крайне важен для удаления кода во время сборки Player, так как его путь может быть передан BuildPipeline.BuildPlayer, чтобы предотвратить удаление типов скриптов и модулей Unity, требуемых AssetBundles.
Ниже приведен пример файла манифеста корня:
ManifestFileVersion: 0
CRC: 2309754985
AssetBundleManifest:
AssetBundleInfos:
Info_0:
Name: bundle_prefab
Dependencies:
Dependency_0: bundle_sobject
Info_1:
Name: bundle_sobject
Dependencies: {}
Манифестные пакеты
Unity дополнительно генерирует пакет манифеста, который представляет собой файл AssetBundle, названный в честь каталога, в котором он находится. Он содержит объекты AssetBundleManifest, которые Unity использует для определения зависимостей пакета, которые должны загружаться во время выполнения.
Существуют два дополнительных файла, созданных в процессе сборки.
Первый из них — это небольшой файл AssetBundle, названный в честь каталога, в котором он находится (где были построены AssetBundles). Этот файл называется Manifest Bundle и содержит объекты AssetBundleManifest, которые будут полезны для выявления зависимостей пакетов, загружаемых во время выполнения. Информацию об использовании этого пакета см. в Загрузка ассетов из пакетов.
Пакет манифеста также включает свой собственный файл .manifest. Ниже приведен пример файла манифеста пакета манифеста:
ManifestFileVersion: 0
AssetBundleManifest:
AssetBundleInfos:
Info_0:
Name: scene1assetbundle
Dependencies: {}
В файле .manifest для пакета манифестов записывается, как AssetBundles связаны между собой и какие зависимости между ними существуют. Эта информация похожа на информацию, записываемую объектом AssetBundleManifest внутри пакета манифестов.
Файл манифеста важен для предотвращения удаления кода для неиспользуемых типов, которые вы используете в вашем AssetBundle. Если вы включили удаление кода для в вашем проекте, установите BuildPlayerOptions.assetBundleManifestPath для передачи пути к этому манифесту при выполнении сборок проигрывателей.
Отчет о сборке
Builds AssetBundle дополнительно генерируют файл BuildReport, который представляет собой Unity SerializedFile, записанный в Library/LastBuild.buildreport внутри каталога проекта. Этот файл полезен для просмотра резюме времени для шагов сборки и подробного просмотра содержимого AssetBundle. Вы можете использовать BuildReport API для чтения информации из файла BuildReport.
Для просмотра содержимого файла BuildReport также можно использовать следующие инструменты:
- Project Ревизор
- Отчет о сборке Inspector