Экземпляры префабов в версии 1.2.0
Создание экземпляров префабов — это процесс создания объектов и компонентов из файла .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 при загрузке. Это позволяет нескольким сценам ссылаться на одни и те же ресурсы, не дублируя память.
Компоненты, созданные посредством создания экземпляров, следовательно:
- Ссылаются на одни и те же ресурсы
- Удаление ресурса приведет к тому, что экземпляр будет ссылаться на нулевой элемент
Дальнейшие шаги
Вот несколько ссылок, которые помогут вам начать использовать создание экземпляров в ваших проектах:
- Пример создания экземпляра префаба на GitHub
- Scene.instantiate JavaScript API
Мы с нетерпением ждем, как сообщество будет использовать создание экземпляров для создания потрясающих впечатлений!