Экземпляры префабов в версии 1.2.0

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

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

До версии 1.2.0 

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

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

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

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

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

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

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

1const mainScene = await engine.loadMainScene('Scene.bin');
2const zombie = await engine.loadPrefab('Zombie.bin');
3
4// Создаем орду зомби
5for (let i = 0; i < 100; ++i) {
6    const {root} = mainScene.instantiate(zombie);
7}

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

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

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

1const zombie = await engine.loadPrefab('Zombie.bin');
2const zombieHead = zombie.findByName('Head')[0];
3zombieHead.addComponent(LookAtComponent);
4
5const nextScene = engine.load('NextScene.bin');
6
7// Только после создания экземпляра, LookAtComponent.onActivate()
8// и LookAtComponent.start() будут вызваны.
9nextScene.instantiate(zombie);

GLTF 

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

1const avocado = await engine.loadGLTF('Avocado.glb');
2
3// Делаем салат из авокадо
4for (let i = 0; i < 100; ++i) {
5    const {root} = scene.instantiate(avocado);
6}

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

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

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

Компоненты, созданные посредством instantiation, следовательно:

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

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

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

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

Last Update: May 19, 2024

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