Создание экземпляров префабов — это процесс создания объектов и компонентов из файла .bin/.glb.

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

До версии 1.2.0 

Создание экземпляров “префабов” было доступно через (теперь устаревший) метод append:

const promises = [];
for (let i = 0; i < 100; ++i) {
    promises.push(await engine.scene.append('Zombie.bin'));
}
await Promise.all(promises);

Этот API имеет ограничения:

  • Сцену нужно загрузить и разобрать 100 раз.
  • Каждый Zombie.bin создает новые мэш-сетки, текстуры и материалы.

Давайте посмотрим, как Wonderland Engine 1.2.0 помогает решить эти проблемы!

Создание экземпляров 

Любая сцена, загруженная через loadScene, может быть получателем для создания экземпляров:

const mainScene = await engine.loadMainScene('Scene.bin');
const zombie = await engine.loadPrefab('Zombie.bin');

// Создаем орду зомби
for (let i = 0; i < 100; ++i) {
    const {root} = mainScene.instantiate(zombie);
}

Так как результат является экземпляром Object3D, вы можете изменить иерархию следующим образом:

const {root} = mainScene.instantiate(zombie);
// `root` является родителем Object3D для всего графа сцены `Zombie.bin`.
root.setScalingLocal([0.5, 0.5, 0.5]);

Вы можете вызвать instantiate() как для активных, так и для неактивных сцен. Хотя приведенный выше пример показывает, как использовать его в активной сцене, создание экземпляров в неактивной сцене работает аналогично:

const zombie = await engine.loadPrefab('Zombie.bin');
const zombieHead = zombie.findByName('Head')[0];
zombieHead.addComponent(LookAtComponent);

const nextScene = engine.load('NextScene.bin');

// Только после создания экземпляра вызываются LookAtComponent.onActivate()
// и LookAtComponent.start().
nextScene.instantiate(zombie);

GLTF 

Создание экземпляров не ограничивается форматом сцены Wonderland Engine (.bin), но также может использоваться с glTF:

const avocado = await engine.loadGLTF('Avocado.glb');

// Делаем салат из авокадо
for (let i = 0; i < 100; ++i) {
    const {root} = scene.instantiate(avocado);
}

Префабы glTF также имеют дополнительные методы для управления расширениями. Для получения более подробной информации взгляните на PrefabGLTF API.

Замечание о ресурсах 

Как было упомянуто в посте в блоге о мультисценах, ресурсы перемещаются в экземпляр engine при загрузке. Это позволяет нескольким сценам ссылаться на одни и те же ресурсы, не дублируя память.

Компоненты, созданные посредством создания экземпляров, следовательно:

  • Ссылаются на одни и те же ресурсы
  • Удаление ресурса приведет к тому, что экземпляр будет ссылаться на нулевой элемент

Дальнейшие шаги 

Вот несколько ссылок, которые помогут вам начать использовать создание экземпляров в ваших проектах:

Мы с нетерпением ждем, как сообщество будет использовать создание экземпляров для создания потрясающих впечатлений!

Last Update: May 19, 2024

Будьте в курсе.