Организация ассетов в AssetBundles
Когда вы создаете AssetBundle, есть некоторые ограничения и организационные стратегии, о которых нужно знать.
Существуют некоторые ограничения в отношении того, какие ассеты можно поместить в AssetBundle и как их настроить. В следующей таблице содержатся ограничения AssetBundles:
| Ограничение | Описание |
|---|---|
| Типы файлов |
|
| Название | Имя AssetBundle должно отличаться от имени папки выхода. |
| Поддержка платформы | AssetBundles могут быть загружены только на конкретной платформе, для которой они созданы. Редактор может загружать любые AssetBundle, независимо от платформы, определенной в пункте 2.1.1. Построить профиль, но некоторые ресурсы могут загружаться неправильно, если они используют формат платформы, не поддерживаемый операционной системой, на которой установлен Редактор. |
AssetBundle соглашения о названиях
Unity автоматически переводит любые имена AssetBundle в строчные буквы во время процесса сборки. Например, AssetBundle с именем Foo приведет к файлу с именем foo. Чтобы избежать конфликтов или проблем, используйте строчные буквы для имен AssetBundles.
Для AssetBundles не существует установленного или ожидаемого расширения файла. Вы можете указать собственное расширение при определении имени AssetBundle, и Unity будет его соблюдать. Однако это может вступить в конфликт с функцией варианта AssetBundle, которая ожидает, что варианты будут отличаться различными расширениями с одним и тем же корневым именем файла.
Вы можете использовать флаг BuildAssetBundleOptions.AppendHashToAssetBundleName, чтобы включить хэш содержимого AssetBundle в качестве части имени файла. Это может быть полезно для веб-хостинга, позволяя различным версиям одного и того же AssetBundle существовать вместе.
Однако у этого флага есть недостатки:
- Встроенное кэширование AssetBundle не заменяет старые версии автоматически, поэтому несколько версий одного и того же AssetBundle могут оставаться в кэше.
- Это может повлиять на файловые системы патчей на консольных платформах, потому что небольшие изменения рассматриваются как совершенно новый файл, а не небольшой патч.
Варианты AssetBundle
Вы можете использовать варианты AssetBundle для создания нескольких версий AssetBundle, оптимизированных для различных ситуаций или конфигураций, таких как различные графические настройки. Например, вы можете создать варианты для текстур низкого, среднего и высокого разрешения для поддержки устройств с различными возможностями производительности или выбранными пользователем графическими настройками.
При использовании вариантов AssetBundle, Unity позволяет указать имя варианта для каждого AssetBundle. Сочетание имени AssetBundle и имени варианта уникально идентифицирует каждый вариант AssetBundle. Например, AssetBundle с именем environment может иметь варианты с именами lowQuality, mediumQualityи highQuality.
Имена файлов ассетов в AssetBundles должны совпадать, но содержимое может отличаться в зависимости от назначения варианта.
Вы можете создать вариант в Inspector, используя раскрывающийся список вариантов рядом с AssetBundle, или использовать AssetImporter.assetBundleVariant.
Стратегии организации AssetBundles
Вы можете организовать свои ассеты следующим образом:
- По функциям: организуйте ассеты по функциональным частям проекта. Типичные категории — пользовательский интерфейс, персонажи, окружения и другие элементы, часто используемые в приложении.
- По типу: Группирование по типу фокусируется на группировании ассетов одного типа, таких как аудиотреки или локализационные файлы.
- По использованию во время выполнения: Группировка ассетов, которые загружаются и используются одновременно. Эта стратегия часто используется для проектов, основанных на уровнях.
Вы можете комбинировать эти стратегии в рамках проекта, чтобы получить наилучшую эффективность для вашего приложения. Например, вы можете группировать элементы UI для разных платформ в одном AssetBundle, но группировать его интерактивное содержание по уровням или сценам.
Независимо от используемого вами организационного подхода, рекомендуется следовать следующим общим рекомендациям:
- Разделяйте часто обновляемые объекты от редко изменяемых в разные AssetBundles.
- Создайте отдельные AssetBundles для наборов объектов, которые вряд ли будут загружены одновременно, например, стандартные и высококачественные ресурсы. Вы можете использовать варианты AssetBundle для организации этого.
- Группировка объектов, которые обычно выгружаются вместе. Например, модель, ее текстуры и ее анимации.
- Разделяет AssetBundle, если менее половины его содержимого загружается в одно и то же время.
- Объедините маленький AssetBundles, если контент часто загружается одновременно.
- Если несколько объектов в одном AssetBundle зависят от одного ассета из другого AssetBundle, рассмотрите возможность перемещения зависимости в свой собственный AssetBundle. Аналогичным образом, если несколько AssetBundles ссылаются на одну и ту же группу ассетов, рассмотрите возможность перемещения зависимостей в общий AssetBundle.
Организация ассетов по функциям
Организация ассетов по их функциональному совместному использованию полезна в следующих ситуациях:
- Объединение всех текстур и данных макета для экрана UI.
- Объединение всех моделей и анимаций для персонажа или набора персонажей.
- Объединение текстур и моделей для частей ландшафта, совместно используемых на нескольких уровнях.
Этот подход идеально подходит для загружаемого контента (DLC), поскольку вы можете вносить небольшие изменения в свой проект без необходимости распространять большое количество неизмененных ресурсов среди пользователей. Однако при использовании этого подхода вы должны знать, где и когда каждый ресурс используется в проекте.
Организация ассетов по типу
Вы можете организовать ресурсы одного и того же типа, такие как аудиотреки или файлы локализации языка, в один AssetBundle, что может быть полезно в AssetBundles, которые редко меняются.
Группировка AssetBundles таким образом может привести к меньшему количеству AssetBundles, изменяющихся и требующих распространения при создании инкрементальной сборки. Однако больше AssetBundles может потребоваться для загрузки и загрузки для сборки всех зависимых объектов во время выполнения.
Организация ассетов по использованию во время выполнения
Вы можете сгруппировать ассеты, которые Unity загружает и использует одновременно, что полезно, если вы хотите загрузить AssetBundles на основе сцен. Например, вы можете использовать этот подход для игры, основанной на уровнях, где каждый уровень содержит уникальные ассеты, а AssetBundle содержит все зависимости сцены.
Однако этот подход означает, что ассет в одном AssetBundle может быть использован только в то же время, что и остальные ассеты, или увеличивает время загрузки.
Важно AssetBundle, содержащий сцену, автоматически включает все ассеты, на которые делается ссылка в этой сцене, если они явно не назначены отдельному AssetBundle. Это может привести к дублированию ассетов, если любые другие сцены используют ассеты, на которые делается ссылка в других AssetBundles.