AssetsManager — это мощный инструмент для загрузки и управления внешними ресурсами в сцене Babylon.js. Он предназначен для асинхронного управления различными типами ассетов: текстурами, моделями, звуками и шейдерами. Использование AssetsManager позволяет централизованно контролировать процесс загрузки, отслеживать прогресс и корректно обрабатывать ошибки.
Для начала работы с менеджером ресурсов необходимо создать экземпляр
AssetsManager, привязанный к конкретной сцене:
const assetsManager = new BABYLON.AssetsManager(scene);
После создания менеджера можно добавлять различные задачи загрузки — каждый ресурс или группа ресурсов оформляется в виде LoadTask.
AssetsManager поддерживает несколько типов задач:
TextureTask — загрузка текстур.
const textureTask = assetsManager.addTextureTask(
"wallTextureTask",
"textures/wall.jpg"
);
События задачи:
onSuccess — вызывается после успешной загрузки
текстуры.onError — вызывается при ошибке загрузки.MeshTask — загрузка 3D-моделей.
const meshTask = assetsManager.addMeshTask(
"houseMeshTask",
"",
"models/",
"house.babylon"
);
Опции:
meshesNames — массив имен мешей для загрузки. Пустой
массив загружает все меши.rootUrl и sceneFilename — путь к файлу
модели.BinaryFileTask — загрузка бинарных файлов (например, для пользовательских данных или шейдеров):
const binaryTask = assetsManager.addBinaryFileTask(
"shaderTask",
"shaders/customShader.bin"
);TextFileTask — загрузка текстовых файлов:
const textTask = assetsManager.addTextFileTask(
"configTask",
"config/settings.json"
);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/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, а также анимации, которые автоматически подключаются к сцене.
onError
можно подменять ресурсы на резервные варианты.onProgress
помогает создавать динамичные загрузочные экраны для игр или
интерактивных приложений.Использование AssetsManager обеспечивает структурированную, эффективную и надежную загрузку ресурсов в Babylon.js, позволяя строить масштабные сцены с множеством ассетов и минимизировать задержки при старте приложения.