Менеджеры ресурсов: AssetsManager

AssetsManager — это мощный инструмент для загрузки и управления внешними ресурсами в сцене Babylon.js. Он предназначен для асинхронного управления различными типами ассетов: текстурами, моделями, звуками и шейдерами. Использование AssetsManager позволяет централизованно контролировать процесс загрузки, отслеживать прогресс и корректно обрабатывать ошибки.


Создание и инициализация AssetsManager

Для начала работы с менеджером ресурсов необходимо создать экземпляр AssetsManager, привязанный к конкретной сцене:

const assetsManager = new BABYLON.AssetsManager(scene);

После создания менеджера можно добавлять различные задачи загрузки — каждый ресурс или группа ресурсов оформляется в виде LoadTask.


Типы задач загрузки

AssetsManager поддерживает несколько типов задач:

  1. TextureTask — загрузка текстур.

    const textureTask = assetsManager.addTextureTask(
        "wallTextureTask",
        "textures/wall.jpg"
    );

    События задачи:

    • onSuccess — вызывается после успешной загрузки текстуры.
    • onError — вызывается при ошибке загрузки.
  2. MeshTask — загрузка 3D-моделей.

    const meshTask = assetsManager.addMeshTask(
        "houseMeshTask",
        "",
        "models/",
        "house.babylon"
    );

    Опции:

    • meshesNames — массив имен мешей для загрузки. Пустой массив загружает все меши.
    • rootUrl и sceneFilename — путь к файлу модели.
  3. BinaryFileTask — загрузка бинарных файлов (например, для пользовательских данных или шейдеров):

    const binaryTask = assetsManager.addBinaryFileTask(
        "shaderTask",
        "shaders/customShader.bin"
    );
  4. TextFileTask — загрузка текстовых файлов:

    const textTask = assetsManager.addTextFileTask(
        "configTask",
        "config/settings.json"
    );
  5. CubeTextureTask — загрузка кубических текстур (например, для окружения):

    const cubeTask = assetsManager.addCubeTextureTask(
        "skyboxTask",
        "textures/skybox/sky",
        ".png"
    );

Настройка событий и обработка прогресса

Каждая задача поддерживает события onSuccess и onError. Для глобального контроля процесса загрузки можно использовать события самого AssetsManager:

assetsManager.onTaskSucc ess = function(task) {
    console.log("Задача выполнена:", task.name);
};

assetsManager.onTaskEr ror = function(task) {
    console.error("Ошибка загрузки:", task.name, task.errorObject.message);
};

assetsManager.onProgr ess = function(remainingCount, totalCount, lastFinishedTask) {
    console.log(`Прогресс: ${totalCount - remainingCount}/${totalCount}`);
};

onProgress вызывается после завершения каждой задачи, предоставляя возможность отображать индикаторы загрузки.


Запуск загрузки

После добавления всех задач необходимо инициировать процесс загрузки:

assetsManager.load();

Загрузка выполняется асинхронно, и все задачи обрабатываются параллельно. После завершения всех задач можно запускать действия, зависящие от загруженных ресурсов:

assetsManager.onFin ish = function(tasks) {
    console.log("Все ресурсы загружены");
};

Управление зависимостями и порядок загрузки

Если некоторые ресурсы зависят друг от друга (например, материал использует текстуру), можно организовать последовательную загрузку с помощью onSuccess:

const textureTask = assetsManager.addTextureTask("brickTexture", "textures/brick.jpg");

textureTask.onSucc ess = function(task) {
    const material = new BABYLON.StandardMaterial("brickMat", scene);
    material.diffuseTexture = task.texture;

    const box = BABYLON.MeshBuilder.CreateBox("box", {}, scene);
    box.material = material;
};

Таким образом, текстура гарантированно будет доступна до создания материала.


Использование с ассетами формата glTF

При работе с современными моделями формата glTF/glb часто применяются MeshTask и BinaryFileTask. Пример загрузки glTF:

const gltfTask = assetsManager.addMeshTask(
    "gltfTask",
    "",
    "models/",
    "scene.glb"
);

gltfTask.onSucc ess = function(task) {
    task.loadedMeshes.forEach(mesh => {
        mesh.position = new BABYLON.Vector3(0, 0, 0);
    });
};

glTF поддерживает сложные сцены, материалы PBR, а также анимации, которые автоматически подключаются к сцене.


Оптимизация загрузки

  • Параллельная загрузка: AssetsManager выполняет все задачи параллельно, что ускоряет старт сцены.
  • Кэширование ресурсов: загруженные текстуры и модели повторно используются в сцене без повторной загрузки.
  • Обработка ошибок: с помощью onError можно подменять ресурсы на резервные варианты.
  • Индикаторы прогресса: onProgress помогает создавать динамичные загрузочные экраны для игр или интерактивных приложений.

Рекомендации по структуре проектов

  • Разделять задачи по типам ассетов: текстуры, модели, шейдеры.
  • Группировать ресурсы для отдельных сцен, чтобы AssetsManager загружал только нужное.
  • Использовать функции обратного вызова для привязки загруженных ресурсов к объектам сцены.
  • Для больших проектов можно создавать несколько AssetsManager, каждый из которых отвечает за конкретную часть сцены.

Использование AssetsManager обеспечивает структурированную, эффективную и надежную загрузку ресурсов в Babylon.js, позволяя строить масштабные сцены с множеством ассетов и минимизировать задержки при старте приложения.