18 минут назад
Content Directories в Unity 6.6: закат Asset Bundles

Unity опубликовали ролик-анонс новой версии 6.6 и бегло засветили новую любопытную технологию. И нет, речь не про сериализуемые словари. Если бы мы только знали, что это такое — так что придётся знакомиться.
Content Directories — новая низкоуровневая система сборки и загрузки контента, которая планирует заменить собой уже изрядно постаревшие AssetBundles.
Преследует похожие цели:
Разделить билд на core-контент, который нужен сразу, и остальной контент, который нужен не сразу.
Предоставить lazy references на эти ассеты и подгружать их в хранилище во время выполнения по востребованию.
Но делают они это до банального иначе (многие старожилы узнают в этом свои велосипеды). И работают только для локального контента, который не загружается по remote-каналам и тянется через StreamingAssets (что для WebGL и за Remote-канал сойдёт, хе-хе).
Документация: Unity Docs
Суть работы
Создаётся ScriptableObject (один или некоторое количество). Внутри через Loadable<T> и LoadableSceneId в инспекторе задаются ссылки на ассеты, которые должны попасть в ContentDirectories.
Через Editor-скрипт вызвать BuildPipeline.BuildContentDirectory() для созданных ScriptableObject.
Операция создаст в указанных папках те самые ContentDirectories (по одной на каждый SO), внутри которых будут отдельные файлы с хэш-именами и BuildManifest с маппингом { GUID ассета → хеш-имя файла }.
Теперь в Runtime регистрируем полученные ContentDirectories (одна или некоторое количество) через ContentLoadManager.RegisterContentDirectory. Это загрузит в память созданную мета-информацию об ассетах, но не сами ассеты — lazy references.
Теперь можно через ContentLoadManager.GetRootAssets<....>() запрашивать ScriptableObject'ы из п.1. А из них обращаться к Loadable<T> ссылкам на ассеты.
Получить ассет нужно через Load / LoadAsync. И затем, когда больше не понадобится, выгрузить через Release.
Примеры кода на каждый шаг:
// 1. Создаём ScriptableObject: [CreateAssetMenu] public class AssetRegistry : ScriptableObject { public Loadable<GameObject>[] enemies; public Loadable<Texture2D>[] textures; } // 2-3. Строим Content Directory (Editor): BuildPipeline.BuildContentDirectory(new BuildContentDirectoryParameters { outputPath = "Assets/StreamingAssets/Content", rootAssetPaths = new[] { "Assets/Content/AssetRegistry.asset" } }); // 4. Регистрируем Content Directory (Runtime): var handle = ContentLoadManager.RegisterContentDirectory( Path.Combine(Application.streamingAssetsPath, "Content")); // 5. Получаем SO: var registry = ContentLoadManager.GetRootAssets<AssetRegistry>()[0]; // 6. Загружаем контент: GameObject prefab = await registry.enemies[2].LoadAsync(); // 7. Выгружаем контент: registry.enemies[2].Release(); // 8. Выгружаем Content Directory: ContentLoadManager.UnregisterContentDirectory(handle);
Вытекающие особенности
Технически собирать ContentDirectory можно в любое место. Но лучше применять StreamingAssets, которые будут автоматически скопированы в игровой билд для всех платформ. И Unity умеет предоставлять путь до этой директории в runtime.
Контент из ContentDirectory попадает в сборку. Оно не попадает в исполняемые пакеты, но всё равно остаётся частью билда.
Каждый ассет хранится отдельным файлом, а не в составе бандла. Следовательно загрузка конкретного ассета повлечёт загрузку только конкретно этого ассета. А не всего бандла с другим контентом.
Каждый ассет сам за себя, поэтому не возникает дублирования ассетов, как это было в бандлах при неосторожном разрешении зависимостей между ассетами. Но дублирование можно создать, если разные ContentDirectory на одни и те же ассеты настроить.
Каждый ассет-файл именуется хэшом, следовательно инкрементальная сборка работает на уровне отдельных ассетов и точечно не пересобирает контент, который не изменился. И позволяет версионировать этот контент. Как и бандлы.
Release прям выгружает ассет. Нет ref counting (как у Addressables). За использованиями нужно следить. Как с бандлами.
Коротко говоря, мы легально получаем наборы бандлов, в каждом из которых лежит ровно один ассет.
Конфигурация пока чуть замороченнее. И нет поддержки remote-доставки. Но зато взамен мы получаем "implicit de-duplication, reduced load times, and a lower memory overhead" (с).
Совместимость с Addressables
ContentDirectory и AssetBundle — это низкоуровневые системы сборки. Addressables — это высокоуровневый каркас для организации и доставки контента.
ContentDirectory заменяют AssetBundles, но не отменяют Addressables. Они могут работать вместе. И это официально поддерживается. Более того, можно использовать одновременно ContentDirectory для локального контента и AssetBundles — для remote. И всё это в контексте Addressables.
Т.е. если ваш проект построен на Addressables, то теоретически переезд на ContentDirectory будет максимально простым, т.к. с оригинальным низкоуровневым api напрямую общаться не приходится. И всё ограничится настройками в редакторе.
Выводы
Это всё пересказ документации и увиденного в видео. Опробовать это вживую мне ещё только предстоит. Наверняка там найдётся не один подводный камень.
Но пока чувствую, что наши юнитёвые WebGL-проекты в ближайшее время точно стоит попробовать перевести на эту систему сборки. Unity CLI не подвёл — глядишь, и это не подведёт.
Читают сейчас

43 минуты назад
Google выпустила Gemini 3.8 Flash и закрытую версию для кибербезопасности
Google представила Gemini 3.8 Flash — новую основную модель Flash-линейки, вышедшую всего через три недели после Gemini 3.7 Flash. Модель получила заметный прирост в программировании, агентных задачах

1 час назад
Астрономы обнаружили маленькие красные точки, готовящиеся к слиянию
Существует мнение, что в крупных галактиках современной Вселенной находятся сверхмассивные чёрные дыры (СМЧД). Тем не менее точно неизвестно, как именно эти чёрные дыры стали столь массивными, хотя ас

3 часа назад
Вышел альфа-релиз Paint.NET 5.2 с экспериментальной поддержкой Wine/Linux
1 сентября 2026 года состоялся выпуск альфа-версии графического редактора с открытым исходным кодом Paint.NET 5.2 для Windows 10/11 (64-бита) и с экспериментальной поддержкой Wine/Linux (Wine 11.14, U
3 часа назад
Операционная платформа «Альт Образование» бесплатна для школ — акция от «Базальт СПО»
Операционная платформа «Альт Образование» бесплатна для школ — акция от «Базальт СПО» Организация «Базальт СПО» запускает специальное предложение для школ: операционная система «Альт Образование» 11 п

3 часа назад
Google добавила агентный аналитика видео в Gemini 3.7 Flash, 3.6 Flash и 3.5 Flash-Lite
Google запустила агентный анализ видео для Gemini 3.7 Flash, 3.6 Flash и 3.5 Flash-Lite. Теперь модель анализирует видео не как последовательность кадров с фиксированной частотой, а сама решает, какие