Blueprint-функция Attach Component To Component в Unreal Engine

Друзья, приветствую, с Вами Будуев Антон. В данной статье мы обсудим и разберём Blueprint-функцию Attach Component To Component, которая в Unreal Engine (UE4, UE5) прикрепляет один компонент к другому.

Вскоре выйдет моя бесплатная книга по Blueprints для Unreal Engine в PDF формате. Как она выйдет, рекомендую её скачать, чтобы Вы детально изучили блюпринты Анрил Энджин.

Attach Component To Component в Unreal Engine

Функция Attach Component To Component
Функция Attach Component To Component

В Unreal Engine функция Attach Component To Component прикрепляет текущий компонент к другому компоненту, а при необходимости — и к конкретному Socket (держателю). В результате устанавливает связь между двумя компонентами, делая один из них дочерним по отношению к другому, обеспечивая тем самым, что дочерний компонент будет перемещаться, вращаться и масштабироваться вместе со своим родителем.

Иначе говоря, Attach Component To Component приводит к тому, что прикрепляемый компонент:

  • Следует за родителем — когда родительский компонент меняет свое положение, вращение или масштаб, дочерний компонент автоматически следует за ним, также изменяя своё положение, вращение и масштаб.
  • Создаёт иерархию — прикрепление компонентов создаёт иерархическую структуру, которая может быть полезна для управления сложными объектами.
  • Находится в локальном пространстве — дочерний компонент будет находиться в локальном пространстве родительского (его координаты будут рассчитываться относительно родительского компонента).

Функция работает только с компонентами класса Scene Component или другими дочерними от него классами, так как для прикрепления компонентов нужны данные по трансформации объектов (координаты, вращение и масштаб), которые доступны только в классах, начиная от компонента сцены.

Attach Component To Component может использоваться, например, для прикрепления камеры от третьего лица или оружия к персонажу. Для прикрепления эффектов к точке удара при создании эффектов взрыва и в прочих похожих ситуациях.

Подробнее узнать о самой концепции компонентов в движке Анрил Энджин Вы можете в статье: Unreal Engine Component.

Параметры Attach Component To Component

Рассмотрим параметры функции Attach Component To Component:

  • Target (scene component, по умолчанию Self) — компонент, который нужно прикрепить.
  • Parent (scene component) — родительский компонент для прикрепления компонента Target.
  • Socket Name (name, по умолчанию None) — Socket родительского компонента (используется для SkeletalMeshComponent). Конкретное место родительского компонента, куда будет прикреплен компонент Target. Необязательный параметр. Если сокет не задан, компонент прикрепится к началу родительского компонента.
  • Location Rule (enum) — правила обработки координат при прикреплении. Доступны 3 варианта на выбор:
    — Keep Relative (прикреплённый компонент сохраняет свои прежние значения относительных (Relative) координат).
    — Keep World (прикреплённый компонент автоматически вычисляет свои новые значения относительных (Relative) координат, чтобы соответствовать текущим мировым (World) координатам).
    — Snap to Target (прикреплённый компонент изменяет свои координаты, чтобы прикрепиться непосредственно к родительскому элементу).
  • Rotation Rule (enum) — правила обработки вращения при прикреплении. Доступны 3 варианта на выбор:
    — Keep Relative (прикреплённый компонент сохраняет свои прежние значения относительного (Relative) поворота).
    — Keep World (прикреплённый компонент автоматически вычисляет свои новые значения относительного (Relative) поворота, чтобы соответствовать текущему мировому (World) повороту).
    — Snap to Target (прикреплённый компонент изменяет свой поворот, чтобы прикрепиться с поворотом родительского элемента).
  • Scale Rule (enum) — правила обработки масштаба при прикреплении. Доступны 3 варианта на выбор:
    — Keep Relative (прикреплённый компонент сохраняет свои прежние значения относительного (Relative) масштаба).
    — Keep World (прикреплённый компонент автоматически вычисляет свои новые значения относительного (Relative) масштаба, чтобы соответствовать текущему мировому (World) масштабу).
    — Snap to Target (прикреплённый компонент изменяет свой масштаб, чтобы прикрепиться с масштабом родительского элемента).
  • Weld Simulated Bodies (bool, по умолчанию True) — склеивать или нет симулируемые физические тела. При этом при симуляции физики формы склеенного объекта переносятся в родительский компонент, что может привести к необратимым изменениям, которые сохранятся даже при разъединении компонентов.
  • Return Value (bool, возвращаемый параметр) — возвращает значение True, если прикрепление прошло удачно или компонент уже был прикреплён до этого. В противном случае — False.

Практический урок в Unreal Engine: прикрепляем компонент оружия к компоненту персонажа при помощи Attach Component To Component

Данный практический урок мы реализуем через разбор готового кода, который нам поставляется с шаблоном проекта игры от первого лица в Unreal Engine (UE5). Дело в том, что в этом шаблоне уже имеется персонаж, а также оружие, которое мы, непосредственно находясь в игре, можем присоединить к своему персонажу. Это присоединение как раз и реализовано через функцию Attach Component To Component.

Actor оружия BP_Pickup_Rifle

  1. Итак, для начала откроем Blueprint-класс оружия BP_Pickup_Rifle. Находится он по пути /All/Game/FirstPerson/Blueprints.
  2. Данный Actor также размещён на сцене. Основное предназначение данного Актора — это взять оружие. То есть, он является поднимаемым предметом.

    Actor оружия BP_Pickup_Rifle
    Actor оружия BP_Pickup_Rifle
  3. Сам Актор состоит из Mesh оружия и SphereCollision (коллизии), которая реагирует на пересечение с игроком BP_FirstPersonCharacter.

    Скриншот

    Сферическая коллизия реагирует на пересечение с игроком (BP_FirstPersonCharacter)
    Сферическая коллизия реагирует на пересечение с игроком (BP_FirstPersonCharacter)

    Код на BlueprintUE

    Если код отображается без связей, нажмите сверху кода на кнопку «Graph» Если код отображается без связей, нажмите сверху кода на кнопку "Graph"
  4. Далее по коду нодой Get Children Components получаем массив дочерних элементов у компонента First Person Mesh (Mesh персонажа) и проверяем этот массив на наличие в нём компонента оружия BP_Weapon_Component. Если находим такой компонент, то переменную Character Has Weapon устанавливаем в значение True и заканчиваем цикл For (передаём поток в ноду Break цикла For). Это означает, что персонаж уже имеет оружие и поднять текущее оружие он уже не может.

    Скриншот

    Проверяем у персонажа наличие компонента оружия.
    Проверяем у персонажа наличие компонента оружия.

    Код на BlueprintUE

    Если код отображается без связей, нажмите сверху кода на кнопку «Graph» Если код отображается без связей, нажмите сверху кода на кнопку "Graph"
  5. При окончании цикла перебора массива дочерних компонентов (поток Completed цикла For) переходим к процессу добавления компонента оружия к компоненту Mesh персонажа BP_FirstPersonCharacter. Но перед этим проверяем переменную Character Has Weapon. Продолжаем процесс присоединения только тогда, когда эта переменная имеет значение False, то есть компонента оружия у персонажа до сих пор нет. Добавление компонента производим нодой Add BP_Weapon_Component, которая динамически добавляет к персонажу компонент BP_Weapon_Component в качестве подобъекта (замечу, визуальную составляющую компонента мы еще не присоединили к персонажу, мы просто добавили его в качестве подобъекта). После этого удаляем текущий Актор поднимаемого предмета BP_Pickup_Rifle.

    Скриншот

    При пересечении коллизии поднимаемого предмета проверяем у компонента Mesh персонажа наличие дочерних компонентов с оружием, и если таковых нет, добавляем персонажу компонент оружия.
    При пересечении коллизии поднимаемого предмета проверяем у компонента Mesh персонажа наличие дочерних компонентов с оружием, и если таковых нет, добавляем персонажу компонент оружия.

    Код на BlueprintUE

    Если код отображается без связей, нажмите сверху кода на кнопку «Graph» Если код отображается без связей, нажмите сверху кода на кнопку "Graph"

Как только процесс дошёл до ноды Add BP_Weapon Component из предыдущего 5 пункта, так сразу в движке Unreal Engine включился в работу компонент BP_Weapon_Component и весь код, который в нём описан, также начал свою работу. Рассмотрим отдельно код пользовательского компонента BP_Weapon_Component. Именно внутри него и происходит визуальное прикрепление компонента оружия к компоненту First Person Mesh (Mesh персонажа) с помощью функции Attach Component To Component.

Прикрепляем BP_Weapon_Component к компоненту персонажа функцией Attach Component To Component

  1. Откроем Blueprint пользовательского компонента оружия BP_Weapon_Component. В нём располагается обработка двух событий. В рамках темы текущей статьи (функция Attach Component To Component) рассматривать мы будем исключительно код, обрабатывающий событие Event Begin Play, и то только до необходимой нам функции.
  2. Итак, событие Event Begin Play, находящееся в компоненте оружия, включается в работу ровно в тот момент, когда активируется сам компонент. А компонент, напомню, активируется при вызове функции добавления компонента Add BP_Weapon_Component. Именно при обработке события Event Begin Play и прикрепляется наш компонент оружия к персонажу.
  3. Чтобы получить Actor персонажа, используем ноду Get Owner, возвращающую Actor владельца текущего компонента оружия.
  4. Далее тип Actor персонажа приводим к типу BP_FirstPersonCharacter, и из него нодой Get FirstPersonMesh возвращаем компонент Mesh, к которому и нужно прикрепить компонент оружия.
  5. После чего вызываем функцию Attach Component To Component и настраиваем её параметры:
    Target: указываем Self, то есть текущий компонент оружия, в котором расположен код.
    Parent: указываем компонент, к которому мы хотим присоединить текущий компонент, а это Mesh персонажа.
    Socket Name: указываем значение GripPoint. Если посмотреть Skeletal Mesh данного персонажа (/All/Game/FirstPersonArms/Character/Mesh/SK_Mannequin_Arms_Skeleton), то можно увидеть, что данный сокет находится на кисти правой руки. Это означает, что компонент оружия присоединится не просто к компоненту Mesh, а именно к сокету, находящемуся на кисти правой руки.
    Сокет GripPoint
    Сокет GripPoint

    Location, Rotation, Scale Rule: везде указываем Snap to Target, чтобы наш компонент оружия присоединился непосредственно к родительскому компоненту, используя значения родительской трансформации.

Скриншот

Практический урок в Unreal Engine: прикрепляем компонент оружия к компоненту персонажа при помощи Attach Component To Component
Практический урок в Unreal Engine: прикрепляем компонент оружия к компоненту персонажа при помощи Attach Component To Component

Код на BlueprintUE

Если код отображается без связей, нажмите сверху кода на кнопку «Graph» Если код отображается без связей, нажмите сверху кода на кнопку "Graph"


Таким образом, используя функцию Attach Component To Component, можно в игровом движке Unreal Engine (UE, UE5) присоединять один компонент к другому.

Совет. Вскоре выйдет моя бесплатная книга по Blueprints для Unreal Engine в PDF формате. Как она выйдет, рекомендую её скачать, чтобы Вы детально изучили блюпринты Анрил Энджин.

Оцените статью
( 1 оценка, среднее 5 из 5 )
Поделитесь этой статьей со своими знакомыми в социальных сетях, возможно, эта статья кому-то будет полезна
Unreal Engine - это просто
Добавить комментарий

Нажимая на кнопку "Отправить комментарий", я даю согласие на обработку персональных данных и принимаю политику конфиденциальности.