Unity 6.3
0 онлайн 106 гостей 3 в системе
Вход
Ассеты и медиа Шаг 86 из 148

Введение в AssetBundles

AssetBundle — это архивный файл, который можно использовать для группировки ресурсов для создания загружаемого контента (DLC) или уменьшения первоначального размера установки приложения. AssetBundles также можно использовать для загрузки оптимизированных ресурсов для конкретной платформы или снижения использования памяти во время выполнения.

AssetBundle может содержать ресурсы, не относящиеся к коду конкретной платформы, такие как модели, текстуры, префабы, аудиоклипы или целые сцены, которые Unity загружает во время выполнения. AssetBundles относятся к конкретной платформе, поскольку Unity компилирует данные ресурсов в форматы, основанные на BuildTarget, которые вы устанавливаете при создании сборки. Например, AssetBundle, созданный для iOS, не совместим с Android.

Вы также можете сжать AssetBundles с помощью LZMA или LZ4 для эффективного распространения архивов.

Чтобы построить и определить AssetBundles, вы можете использовать пакет высокого уровня Addressables, который обеспечивает способ определения и построения AssetBundles из Unity Editor. Если вы предпочитаете низкоуровневый контроль API, вы можете использовать BuildPipeline.BuildAssetBundles, AssetBundleи UnityWebRequestAssetBundle собственный APIs.

Причины использования AssetBundles

Использование AssetBundles может помочь с распространением контента и оптимизации производительности вашего приложения. Ниже приведены преимущества использования системы AssetBundle:

  • Динамическая доставка контента: Вы можете использовать AssetBundles для загрузки ресурсов по требованию, что особенно полезно для игр с загружаемым контентом (DLC), эпизодических обновлений или моделей прямого сервиса. Это также помогает эффективно управлять памятью, обеспечивая, чтобы в память загружались только те ресурсы, в которых нуждается ваше приложение.
  • Уменьшение размера сборки: Перемещение ресурсов в AssetBundles может уменьшить первоначальный размер сборки приложения, что важно для мобильных игр или платформ со строгими ограничениями размера.
  • Совместимость платформ: Вы можете создать AssetBundles для различных платформ, уменьшая необходимость включения ресурсов, специфичных для платформы, в сборку приложения.

AssetBundles полезны, если вы хотите оптимизировать загрузку ассетов, например, только потоковое содержимое вблизи местоположения персонажа, только загрузка соответствующего локализованного содержимого или загрузка ассетов в фоновом режиме. Однако система AssetBundle обеспечивает низкоуровневое управление ассетами, поэтому вы можете рассмотреть возможность использования пакета Addressables, который обеспечивает более высокоуровневый способ управления AssetBundles в вашем проекте.

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

Ограничения

Система AssetBundle имеет следующие ограничения:

  • AssetBundle можно использовать только в скриптах; интерфейса редактора для их сборки нет.
  • AssetBundle API не отслеживает зависимости ассетов. Например, если вы хотите загрузить префаб из AssetBundle, вам нужно вручную загрузить AssetBundles и любые AssetBundle, от которых зависит AssetBundle, прежде чем загрузить префаб. Безопасная разгрузка AssetBundles часто требует написания системы подсчета ссылок. Дополнительную информацию см. в Обработка зависимостей между AssetBundles и.
  • Вам нужно вручную выделять и освобождать память, поэтому вы можете создать утечки памяти или отсутствующее содержимое, выгружая ассеты из AssetBundle, на которые опирается другой код.
  • AssetBundle API не знает, размещается ли AssetBundle локально или удаленно, поэтому вам нужно отслеживать местоположение всех AssetBundles в вашем проекте.

Структура AssetBundle

AssetBundle является контейнерным форматом файла, похожим на zip-файл. Он содержит следующие типы файлов в заголовке двоичного формата:

  • Серийные файлы: Содержит серийные объекты Unity. Это тот же формат двоичного файла, который используется в сборках Player. Вывод зависит от того, что содержит AssetBundle:
    • Только ассеты: Unity создает один серийный файл.
    • Только сцены: Unity создает два серийных файла для каждой сцены. Один файл содержит объекты из иерархии сцены, а второй содержит любые объекты, на которые сделана ссылка.
  • Файлы ресурсов: Содержит куски двоичных данных, хранящихся отдельно для некоторых ассетов, таких как текстуры и аудио. Это разделение позволяет Unity использовать многопоточность для эффективной загрузки ассетов с диска.

Файл AssetBundle всегда содержит сериализированную AssetBundle объект, который действует как каталог для содержимого AssetBundle. Вы можете использовать AssetBundle экземпляр, чтобы загружать в коде ассеты из конкретного архива AssetBundle. Подробнее о внутреннем формате файла см. Ссылка на формат файла AssetBundle.

Scene AssetBundles

AssetBundle, не содержащий сцен, создается на основе списка ассетов. Unity поддерживает назначение файлов сцены AssetBundle, но вы не можете смешивать сцены с другими ассетами внутри одного AssetBundle. В API, этот тип AssetBundle называется потоковой сценой AssetBundle, доступной через AssetBundle.isStreamedSceneAssetBundle.

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

AssetBundle поддержка между Unity версиями

Любой AssetBundles, созданный с помощью более старых версий Unity, обычно совместим с более новыми версиями Unity. Однако, если между версиями имеются значительные изменения, Unity может оказаться не в состоянии загрузить данные, и вам придется перестроить AssetBundle с более новой версией Unity. Unity не поддерживает обратную совместимость AssetBundles, поэтому вы не можете загрузить AssetBundle, созданный с помощью более новой версии Unity в более старую версию Unity.

Если формат сериализации для объекта изменился, код загрузки AssetBundle читает этот объект с помощью метода безопасной двоичной десериялизации чтения. Этот метод использует деревья типов для сопоставления полей в серийизованных данных с текущим расположением серийизации объекта, что влияет на производительность. Если AssetBundles построен без деревьев типов (BuildAssetBundleOptions.DisableWriteTypeTree), любые изменения серийизации в более новой версии Unity препятствуют успешной загрузке и могут привести к сбоям. Кроме того, безопасные двоичные чтения медленны, и вы можете избежать этого, перестроив AssetBundles так, чтобы он соответствовал текущей сборке Проигрывателя.

Тип: По умолчанию, Unity включает версию Unity Editor использованный для строительства AssetBundle внутри AssetBundle заголовок. Эта информация может привести AssetBundles Чтобы избежать этого, исключите версию редактора из заголовка. Дополнительные сведения см. в BuildAssetBundleOptions.AssetBundleStripUnityVersion.

Unity сериализирует AssetBundles на основе версии Unity и типов C#, присутствующих во время их создания. Unity хранит информацию в структурах дерева типов и использует эту информацию при загрузке объектов из различных версий Unity Editor. Дополнительные сведения о TypeTrees см. в Оптимизация AssetBundles

Поддержка скриптов

AssetBundles не может содержать сборки, поэтому их нельзя использовать для распространения новых классов C# или изменений в существующих классах. Однако AssetBundle можно использовать для распространения экземпляров серийных объектов, таких как ассеты ScriptableObject.

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

Unity использует условная компиляция информации в вашем коде, чтобы определить поля, которые должны быть включены в AssetBundle. Если компиляция поля была сделана условной с помощью #if директива и соответствующий символ не определен в AssetBundle время построения, тогда Unity не включает это поле в AssetBundle.

Например, в следующем фрагменте кода поле always безоговорочно включено в AssetBundle, но поле experimental включается только в том случае, если символ EXPERIMENTAL_FEATURE определен во время сборки:

public class MyData : ScriptableObject
{
    public int always;
#if EXPERIMENTAL_FEATURE
    public int experimental;
#endif

public int ConditionalDataValue()
{
#if EXPERIMENTAL_FEATURE
    return experimental;
#else  
    return always;
#endif 
}

}

Здание AssetBundles

Для построения AssetBundles можно использовать следующий метод:

  • Addressables: Пакет Addressables представляет собой удобный для пользователя способ определения и создания AssetBundles из Unity Editor. Он упрощает создание и управление AssetBundle с высокоуровневым API.
  • Native APIs: BuildPipeline.BuildAssetBundles, AssetBundleи UnityWebRequestAssetBundle являются нативными APIs, которые можно использовать для сборки AssetBundles, но они требуют ручного управления зависимостями, и для их использования необходимо написать собственный скрипт сборки.

Дополнительные сведения см. в разделе Создание ассетов в AssetBundle.

Многоквартирный дом AssetBundles

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

Дополнительные ресурсы