В отличие от классической системы акторов Unreal Engine, в Scene Graph для определения объектов в мире используется система модулей и компонентов. Модули выступают в качестве контейнеров для компонентов и других модулей, а компоненты обеспечивают привязку к модулям, к которым они присоединены. Для создания игрового объекта в Scene Graph необходимо начать с базового модуля, после чего добавить данные и поведение при помощи компонентов. Каждый компонент задаёт свой отдельный элемент поведения, поэтому, комбинируя их, вы можете создавать сложные объекты, которые можно использовать повторно для создания более сложных систем.
Принципы сборки
Разберём это на примере фонарных столбов в первой секции холла шаблонов. Каждый фонарный столб — это готовый элемент или набор модулей и компонентов, собранных в единый объект. Объект заготовки приобретает характеристики, поведение, свойства и атрибуты модулей и компонентов, из которых он состоит. Более подробно о модулях и компонентах вы можете узнать в разделе Работа с модулями и компонентами.
Доработка посредством создания экземпляров
Готовые элементы являются ресурсами, что позволяет создавать их экземпляры на уровнях в процессе редактирования или во время игры. Каждый раз, когда вы перетаскиваете готовый элемент из Каталога ресурсов или создаёте копию в коде Verse, вы создаёте новый экземпляр такого готового элемента Scene Graph в мире.
При том, что на обработку каждого экземпляра готового элемента выделяется отдельный объём памяти, создание экземпляров новых готовых элементов не удваивает затраты памяти, поскольку ресурсы, используемые для готового элемента, являются общими для всех экземпляров.
Несмотря на то, что создание экземпляров одного и того же объекта открывает достаточно широкие возможности, готовые элементы сами по себе также могут использоваться для быстрой доработки вашего проекта. В Каталоге ресурсов откройте папку LightPost. В этой папке хранятся ресурсы для создания конечного дизайна готового элемента P_LightPost
Каждый фонарный столб в холле представляет собой часть готового элемента. По мере движения по коридору можно увидеть, что на каждом шаге добавляется новый компонент и в конечном итоге мы получаем окончательный вариант готового элемента.
Первый фонарный столб представляет собой простую систему из трёх модулей: столба, опорной точки и фонаря. У каждого из этих трёх модулей имеется свой transform_component, определяющий место, где они располагаются на уровне. Как родительский модуль, так и модуль Lantern имеют компонент mesh_component, который делает их видимыми и отображает модели для фонарного столба и фонаря соответственно. Объединяет их модуль Pivot, который представляет собой связующее звено между фонарным столбом и фонарём.
Второй столб отличается от изначального варианта тем, что в нём добавлен новый модуль с sphere_light_component, являющийся дочерним элементом модуля Lantern, что создаёт свечение.
Чтобы сделать свечение ещё более интересным и живым, в третьем варианте фонарного столба добавляется компонент particle_system_component, создающий симуляцию мотыльков, порхающих вокруг модуля SphereLight.
В четвёртом экземпляре фонарного столба в модуль Pivot добавляются пользовательские компоненты simple_movement_component и keyframe_movement_component. Эти компоненты вместе создают имитацию движения модуля, включая его дочерние элементы, позволяя фонарю раскачиваться.
Эти компоненты используют Verse для определения траектории движения фонаря, границ его движения, а также его вращение для имитации воздействия ветра на источник света. Компонент перемещения по опорным кадрам создаёт плавное и непрерывное перемещение на основе координат в unique_movement_component.
В последнем экземпляре фонарного столба добавляется пользовательский компонент Verse lantern_interaction_component, а также interactable_component к модулю Lantern. Когда игрок подходит к фонарю и взаимодействует с ним, lantern_interaction_component включает и выключает фонарь, включая и отключая каждый light_component и particle_system_component на всём фонарном столбе.
Переопределение
При создании экземпляра готового элемента в начале используются те же значения по умолчанию, что и в определении готового элемента, из которого он создан. Но что, если потребуется изменить что-либо в созданном экземпляре готового элемента? К примеру, будет нужен источник света другого цвета или металлический столб вместо деревянного. В этом случае нам на помощь придут возможности переопределения.
Переопределение позволяет изменять значения экземпляров класса готового элемента для настройки каждого экземпляра без необходимости вносить изменения непосредственно в родительский готовый элемент. Когда вы вносите изменения в настройки компонента, вложенного в экземпляр готового элемента, эти изменения переопределяют настройки родительского готового элемента и влияют на то, как модуль будет работать на уровне этого компонента только в этом конкретном экземпляре.
Переопределение можно выполнять для отдельных экземпляров готовых элементов, чтобы сделать сцену более разнообразной. Если же вы захотите применить изменения ко всем экземплярам готового элемента, вы можете воспользоваться Редактором готовых элементов, чтобы применить эти изменения к каждому готовому элементу в сцене.
Возможности Verse в Scene Graph
Scene Graph — это система, встроенная в язык Verse и позволяющая использовать его для решения самых разнообразных задач. Готовые элементы, которые вы создаёте в своём проекте, доступны в качестве классов ресурсов в Verse через файл Assets.digest.verse, и вы можете обращаться к ним в коде как в компонентах Verse, так и в устройствах Verse.
Вы также можете использовать Verse для поиска отдельных модулей и компонентов в сцене. Функция GetComponents() позволяет получать определённые компоненты в зависимости от их типа, а GetEntities() — возвращать все дочерние модули конкретного родительского элемента. Вы также можете выполнять поиск вверх или вниз по иерархии в Scene Graph, чтобы находить дочерние или родительские модули. Готовый элемент P_LightPost, используемый в этом шаблоне, использует Verse для создания раскачивающегося движения фонаря и возможности взаимодействовать с ним.
Более подробно о создании функциональных игровых объектов вы можете узнать в разделе Перемещение и взаимодействие.
Перемещение и взаимодействие
Узнайте, как добавление модулям возможностей перемещения позволит создать функциональные игровые объекты с помощью компонента Verse и компонента перемещения по опорным кадрам.