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

Что такое объект Bundle?

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

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

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

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

Что такое Asset Bundle в Unity

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

Основная цель и преимущества

Основная цель Asset Bundles — отделить ресурсы (префабы, текстуры, модели, аудио, материалы) от основного исполняемого файла (билда). Это дает несколько критически важных преимуществ:

  • Сокращение начального размера приложения: Основной билд содержит только минимальный набор ресурсов. Остальной контент (уровни, персонажи, обновления) загружается по мере необходимости из Bundle.
  • Возможность динамического обновления контента: Вы можете добавлять новые уровни, скины или исправлять ошибки в ресурсах без необходимости выпуска нового билда всего приложения. Bundle можно хранить на сервере и загружать при запуске или по требованию.
  • Эффективное управление памятью: Ресурсы загружаются и выгружаются вручную, что позволяет контролировать использование памяти, особенно на платформах с ограничениями (мобильные устройства).
  • Разделение контента для разных платформ: Можно создавать отдельные Bundle для разных качеств текстур (например, для высокой и низкой детализации) или даже для разных локализаций.

Структура и создание Bundle

Asset Bundle создается в редакторе Unity путем назначения ресурсам специального тега (имени Bundle) и последующего выполнения билда через скрипт или меню.

В редакторе, в окне Inspector для любого ресурса (например, префаба), есть поле Asset Bundle, где можно задать имя:

// Пример скрипта для создания Asset Bundle (используется в меню билда)
using UnityEditor;

public class BuildAssetBundles
{
    [MenuItem("Assets/Build AssetBundles")]
    static void BuildAllAssetBundles()
    {
        // Создаёт Bundle в папке AssetBundles в корне проекта
        BuildPipeline.BuildAssetBundles("AssetBundles", BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
    }
}

При билде Unity собирает все ресурсы с одинаковым именем Bundle в один файл (.unity3d или другой, зависящий от платформы).

Загрузка и использование Bundle в Runtime

Во время выполнения игры Bundle загружаются с локального хранилища или из сети. Основные классы для работы — AssetBundle и WWW (или более современные UnityWebRequest).

// Пример загрузки Bundle и инстанцирования префаба из него (современный подход с UnityWebRequest)
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

public class BundleLoader : MonoBehaviour
{
    public string bundleUrl = "http://myserver.com/bundles/myassets.unity3d";
    public string assetName = "MyPrefab";

    IEnumerator Start()
    {
        // Создаём запрос для загрузки Bundle
        UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(bundleUrl);
        yield return request.SendWebRequest();

        if (request.result != UnityWebRequest.Result.Success)
        {
            Debug.LogError("Failed to load AssetBundle: " + request.error);
            yield break;
        }

        // Получаем AssetBundle из запроса
        AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);

        // Загружаем конкретный ресурс (префаб) из Bundle
        GameObject prefab = bundle.LoadAsset<GameObject>(assetName);

        // Инстанцируем префаб в мире
        Instantiate(prefab);

        // Важно: Bundle можно выгрузить после загрузки всех необходимых ресурсов,
        // если они не требуются для дальнейшей динамической загрузки.
        // bundle.Unload(false); // Выгрузить Bundle, но оставить инстанцированные объекты
    }
}

Ключевые методы класса AssetBundle

  • LoadAsset<T>(string name): Загружает конкретный ресурс по имени.
  • LoadAllAssets<T>(): Загружает все ресурсы указанного типа из Bundle.
  • Unload(bool unloadAllLoadedObjects): Выгружает Bundle из памяти. Параметр false выгружает только Bundle, но оставляет "живые" загруженные из него объекты; true выгружает и Bundle, и все связанные с ним объекты (что может привести к ошибкам, если они используются).

Стратегии и лучшие практики

Работа с Asset Bundles требует планирования:

  • Группировка ресурсов: Логично группировать связанные ресурсы (например, все ресурсы для уровня "Forest" в один Bundle). Это минимизирует количество загрузок.
  • Версионирование и зависимости: Unity может учитывать зависимости между Bundle (если префаб в Bundle_A использует материал из Bundle_B). Важно правильно назначать теги и использовать систему зависимостей при билде.
  • Кэширование: На мобильных платформах Bundle могут кэшироваться локально после первой загрузки из сети.
  • Обработка ошибок: Необходима тщательная обработка ошибок загрузки (сети, отсутствия файла, несовпадения версий).

Asset Bundle — это мощный, но сложный инструмент. Его использование необходимо для создания масштабируемых, легко обновляемых и оптимизированных по памяти проектов в Unity, особенно в профессиональном контексте разработки крупных игр или приложений с постоянным добавлением контента.

Что такое объект Bundle? | PrepBro