Content Directories в Unity 6.6: закат Asset Bundles
Unity опубликовали ролик-анонс новой версии 6.6 и бегло засветили новую любопытную технологию. И нет, речь не про сериализуемые словари.
Content Directories — новая низкоуровневая система сборки и загрузки контента, которая планирует заменить собой уже изрядно постаревшие AssetBundles.
Преследует похожие цели:
1️⃣ Разделить билд на core-контент, который нужен сразу, и остальной контент, который нужен не сразу.
2️⃣ Предоставить lazy references на эти ассеты и подгружать их в память во время выполнения по востребованию.
Но делают они это до банального иначе (многие старожилы узнают в этом свои велосипеды). И работают только для локального контента, который не загружается по remote-каналам и тянется через StreamingAssets. (что для WebGL и за Remote-канал сойдёт, хе-хе)
Документация: Unity Docs
Продолжение в комментарирях: ➡️ Суть работы ➡️ Вытекающие особенности ➡️ Совместимость с Addressables
· 4 ч
🟣 Суть работы 🟣
1️⃣ Создаётся ScriptableObject (один или несколько). Внутри через Loadable и LoadableSceneId в инспекторе задаются ссылки на ассеты, которые должны попасть в ContentDirectories.
2️⃣ Через Editor-скрипт вызвать BuildPipeline.BuildContentDirectory() для созданных ScriptableObject.
3️⃣ Операция создаст в указанных папках те самые ContentDirectories (по одной на каждый SO), внутри которых будут отдельные файлы с хэш-именами и BuildManifest с маппингом { GUID ассета → хеш-имя файла }.
4️⃣ Теперь в Runtime регистрируем полученные ContentDirectories (одна или несколько) через ContentLoadManager.RegisterContentDirectory. Это загрузит в память созданную мета-информацию об ассетах, но не сами ассеты — lazy references.
5️⃣ Теперь можно через ContentLoadManager.GetRootAssets<....>() запрашивать ScriptableObject'ы из п.1. А из них обращаться к Loadable ссылкам на ассеты.
6️⃣ Получить ассет нужно через Load / LoadAsync. И затем, когда больше не понадобится, выгрузить через Release.
Примеры кода на каждый шаг: // 1. Создаём ScriptableObject: [CreateAssetMenu] public class AssetRegistry : ScriptableObject { public Loadable[] enemies; public Loadable[] 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()[0];
// 6. Загружаем контент: GameObject prefab = await registry.enemies[2].LoadAsync();
// 7. Выгружаем контент: registry.enemies[2].Release();
// 8. Выгружаем Content Directory: ContentLoadManager.UnregisterContentDirectory(handle);
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
коммент удалён