← Назад к вопросам

Что можно хранить в AssetBundles?

1.0 Junior🔥 131 комментариев
#Unity Core#Ресурсы и ассеты#Управление памятью

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что можно хранить в AssetBundles?

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

В AssetBundle можно упаковать практически любой тип ассета, который существует в проекте Unity, при условии, что он помечен для включения в бандл.

Основные типы ассетов, хранимые в бандлах:

  • Графические ресурсы:
    *   **Текстуры (Textures)** и спрайты (Sprites) любого формата (.png, .tga, .jpg).
    *   **Материалы (Materials)** со всеми их шейдерами и настройками. Важно помнить, что если материал ссылается на текстуру из другого бандла, это создаст зависимость.
    *   **Шейдеры (Shaders)**, включая кастомные. Рекомендуется собирать часто используемые шейдеры в отдельный, общий бандл.
    *   Модели **мешей (Meshes)** из 3D-редакторов.

  • Аудиофайлы:
    *   Аудиоклипы (AudioClips) в поддерживаемых форматах (.wav, .mp3, .ogg). Настройки компрессии и загрузки (Load Type) сохраняются.

  • Префабы (Prefabs) — наиболее мощный вариант.
    Это самый распространенный и полезный тип контента для бандлов. В префаб может быть «запечена» целая сборка:
    *   Иерархия GameObject.
    *   Все компоненты (`MonoBehaviour`, `MeshRenderer`, `Collider`, `AudioSource` и т.д.).
    *   Скрипты (код **не компилируется** в бандл, бандл содержит только ссылки на скриптовые классы, которые должны присутствовать в основном сборке игры).
    *   Все ссылки на другие ассеты (материалы, текстуры, аудио) *внутри* префаба. Если эти ассеты также помечены для этого бандла, они будут включены в него автоматически.

```csharp
// Пример загрузки префаба из AssetBundle
IEnumerator LoadPrefabFromBundle(string bundleUrl, string assetName)
{
    using (UnityWebRequest uwr = UnityWebRequestAssetBundle.GetAssetBundle(bundleUrl))
    {
        yield return uwr.SendWebRequest();

        if (uwr.result == UnityWebRequest.Result.Success)
        {
            AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(uwr);
            GameObject prefab = bundle.LoadAsset<GameObject>(assetName);
            Instantiate(prefab);
            // Важно: бандл можно выгрузить (bundle.Unload(false)),
            // если инстанцированный объект больше не нуждается
            // в оригинальных ассетах (текстуры, меши).
        }
    }
}
```
  • Сцены (Scenes).
    Целые сцены можно помещать в бандлы и загружать их асинхронно, что критически важно для разделения игры на уровни.
```csharp
// Загрузка сцены из AssetBundle
AssetBundle bundle = AssetBundle.LoadFromFile(pathToBundle);
string[] scenePaths = bundle.GetAllScenePaths();
SceneManager.LoadScene(scenePaths[0]);
// Или асинхронно: SceneManager.LoadSceneAsync(...)
```
  • Сериализуемые данные:
    *   Файлы ScriptableObject, которые отлично подходят для хранения настроек игры, данных баланса, диалогов, конфигураций врагов.
```csharp
// Пример: загрузка баланса из ScriptableObject в бандле
AssetBundle configBundle = AssetBundle.LoadFromFile(pathToConfigBundle);
EnemyBalanceData balanceData = configBundle.LoadAsset<EnemyBalanceData>("EnemyBalance");
float enemyHealth = balanceData.baseHealth;
```

Что НЕ хранится и ограничения:

  1. Исходный код C#. AssetBundles содержат только данные и ссылки на уже скомпилированные классы, которые должны быть частью основной сборки (Player) или сборок Assembly Definition Files (DLL), которые также можно при определенных условиях помещать в бандлы.
  2. Настройки проекта и PlayerSettings. Они являются частью билда.
  3. Сильная связность и дублирование. При упаковке важно управлять зависимостями (dependencies) между бандлами. Если ассет А из Бандла-1 ссылается на текстуру из Бандла-2, то при загрузке А нужно будет также загрузить Бандл-2. Unity может помогать в этом с помощью AssetBundle Browser или систем наподобие Addressables, которые абстрагируют работу с зависимостями.
  4. Версионность и совместимость. Бандлы, собранные для одной версии Unity, могут быть несовместимы с другой. Также бандлы, как правило, специфичны для платформы (Android, iOS, Standalone).

Итог: AssetBundles — это гибкая система упаковки игрового контента, позволяющая выносить за пределы основного билда текстуры, модели, префабы, сцены и данные. Ключевые задачи при их использовании — грамотное разделение на бандлы для минимизации дублирования и эффективное управление жизненным циклом (загрузка, кэширование, выгрузка) в рантайме.