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

Экземпляры префабов в версии 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 при загрузке. Это позволяет нескольким сценам ссылаться на одни и те же ресурсы, не дублируя память.

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

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

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

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

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

Last Update: April 3, 2025

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