Предотвращение дублирования ассетов
Дублирование ассетов происходит, когда Unity рекурсивно следует прямые ссылки для того чтобы убеждаться что все необходимые объекты включены в сборку. Средства и сцены не разделены между различными сборками, поэтому один и тот же контент может быть дублирован как в сборке игрока, так и в сборке только контента, которую вы делаете с помощью AssetBundles или Addressables. Для небольших объектов это может не быть проблемой, но для больших ассетов, таких как текстуры или меши, это может привести к большим размерам сборки.
Используйте AssetBundles или Addressables для минимизации дублирования ассетов
Чтобы избежать или свести к минимуму дублирование ресурсов, можно сократить количество контента, входящего в сборку проигрывателя, и вместо этого поместить весь контент в AssetBundles или Addressables.
Чтобы создать минимальную сборку Player, включите только одну начальную сцену, содержащую MonoBehavior который запускает загрузку остальной части контента с помощью AssetBundle или адресуемый APIs. Вы должны также избегать кладки любых ассетов в Папки ресурсов Вы можете отправить вывод из этой сборки в файлы, которые также упоминаются в сборке только содержимого. AssetBundle или Адресуемые сборки с сборкой Player, используя StreamingAssets папка, или размещены на CDN.
Дублирование ассетов в AssetBundles
Unity использует База данных активов чтобы обнаружить все зависимости объекта, когда он встроен в AssetBundle. Unity использует эту информацию о зависимости для определения набора объектов, включаемых в AssetBundle.
Назначение AssetBundle происходит на уровне ассета. Объекты в ассете, явно назначенные AssetBundle, включаются только в этот конкретный AssetBundle. В зависимости от используемого метода BuildPipeline.BuildAssetBundles, ассет явно назначается либо путем установки свойства AssetImporter.assetBundleName на непустую строку, либо путем перечисления его в AssetBundleBuild.assetNames.
Ассеты могут быть дублированы в AssetBundles, если на один и тот же ассет ссылается другой AssetBundles. Если этот ассет явно не назначен AssetBundle, то Unity копирует его содержимое внутри каждого AssetBundle, который ссылается на него.
Например, если два объекта назначены для разделения AssetBundles, но имеют общую ссылку на один и тот же объект зависимости, Unity дублирует объект зависимости в AssetBundles. Эти дублирующие зависимости также инстанцируются, то есть две копии рассматриваются как разные объекты с уникальными идентификаторами. Это увеличивает общий размер AssetBundles приложения и приводит к загрузке в память двух отдельных копий объекта, если загружаются оба родительских AssetBundles.
Чтобы предотвратить это, убедитесь, что общие ресурсы явно назначены AssetBundle. Дополнительные сведения см. в разделе Обработка зависимостей между AssetBundles и. Отчет построения Inspector также является полезным инструментом для выявления дубликатов в AssetBundles.
У Addressables такая же проблема с дублированием ассетов с косвенными ссылками. В этом случае вы можете избежать этого, назначив общие ассеты группе. Инструмент анализа Addressables помогает диагностировать и устранять дублирование ассетов.