- Unreal Engine Apply Point Damage
- Параметры функции ApplyPointDamage
- Damage Type Class
- Unreal Engine Event Point Damage
- Параметры события EventPointDamage
- Практика в Unreal Engine: создаём точечный урон персонажу с раздельным учётом повреждения головы, тела и защитного щита
- Настройка персонажа для нанесения точечного повреждения
- Настройка врага для обработки события точечного урона Event Point Damage
Друзья, приветствую, с Вами Будуев Антон. В данной статье мы обсудим точечный урон в Unreal Engine (UE4, UE5), а именно функцию Apply Point Damage и событие Event Point Damage.
Вскоре выйдет моя бесплатная книга по Blueprints для Unreal Engine в PDF формате. Как она выйдет, рекомендую её скачать, чтобы Вы детально изучили блюпринты Анрил Энджин.
Unreal Engine Apply Point Damage
Функция Apply Point Damage в Unreal Engine — это специализированный вариант общей функции урона ApplyDamage. Предназначен текущий вариант функции для нанесения урона Актору в конкретной его точке с учётом направления удара и силы воздействия. Это делает её особенно подходящей для таких ситуаций, как создание урона от пуль, стрел, снарядов и других атак, где точное место попадания имеет большое значение.
Отличие Apply Point Damage от основной функции урона заключается в том, что основная функция просто наносит урон в виде простого числового значения, а Point Damage через свои параметры Hit from Direction и Hit Info также передаёт повреждённому Актору подробную информацию о точке удара. Что даёт больше возможностей для более детальной обработки этого урона, используя точное место попадания для расчета повреждений или наложения визуальных эффектов.
В дополнении к этому, Apply Point Damage в автоматическом режиме, без необходимости специально вызывать соответствующее событие урона, имеет возможность придавать импульс любому объекту с включённой симуляцией физики. Сила импульса настраивается в отдельном классе Damage Type Class, который затем подключается к функции через специальный параметр. Данный класс мы обсудим чуть ниже в статье.
Саму функцию можно вызывать в любых Blueprint-классах, но, если рассматривать многопользовательские игры, то только на сервере. Также важно знать, что запускает процесс повреждения она только тогда, когда её параметр Base Damage не равен нулю.
Apply Point Damage является инициатором запуска двух событий в Акторе, получившим урон: события любого урона Event Any Damage и события точечного урона Event Point Damage, которое мы будем разбирать ниже в этой статье.
Параметры функции ApplyPointDamage
- Damaged Actor (Actor object reference) — Актор, который получает урон. Это обязательный параметр, определяющий, на кого будет оказано воздействие.
- Base Damage (float) — значение, определяющее, сколько урона будет нанесено.
- Hit from Direction (vector) — вектор направления удара при уроне (точка начала силы удара). Обязательный параметр.
- Hit Info (structure) — полная информация о столкновении. Обязательный параметр.
- Event Instigator (Controller object reference) — контроллер Актора, который вызвал нанесение урона (не всегда совпадает с DamageCauser). Например, контроллер игрока, который стреляет из оружия.
- Damage Causer (Actor object reference) — Актор, который непосредственно наносит повреждение, например, граната, пуля, меч.
- Damage Type Class (reference class) — класс, описывающий тип наносимого урона.
- Return Value (float) — (исходящий параметр) фактический урон, который в конечном итоге был нанесён Актору.
Damage Type Class
В Анрил Энджин Damage Type Class используется в функциях и событиях получения урона и предназначен для определения и описания конкретного типа урона с возможностью настраивать реакции на повреждения от различных источников. Данный класс используется как некий контейнер данных, просто хранящий свойства и функции для конкретного типа урона.
Используя Damage Type Class, можно обрабатывать разные типы урона по-разному, добавляя к каждому типу свою логику. Например, урон от огня может воспламенять повреждённый объект, а урон от холода — замедлять скорость его реакций.
Создать данный класс можно, как и все другие классы, через контекстное меню Content Browser в разделе Blueprint Class. По умолчанию он совершенно пустой, и в нём нет стандартной вкладки Event Graph. Всё, что в нём можно сделать, это описать пользовательские функции, переменные и диспетчеры, определяющие конкретный тип урона.
В текущей статье для нас представляет интерес вкладка Details в разделе Class Defaults. Здесь можно произвести настройки по умолчанию для каждого типа урона. В нашем случае, в практическом примере, который мы рассмотрим ниже, мы будем настраивать значения силы импульса при создании урона через функцию Apply Point Damage. Но обо всём по порядку. Сначала давайте разберём все параметры вкладки Details.
Damage Type (тип урона):
- Caused by World (bool, по умолчанию False) — включить тип урона, вызываемого окружением (падение с высоты, попадание в воду, лаву, повреждение от стихии и т.д.).
- Scale Momentum by Mass (bool, по умолчанию True) — включить масштабирование момента импульса при движении персонажа с учётом его массы.
- Damage Falloff (float, по умолчанию 1,0) — ослабление урона от его центра к границе радиуса воздействия (показатель степени). 1.0 — линейно, 2.0 — квадрат расстояния и т.д.
Rigid Body (твёрдые тела с симуляцией физики, не поддающиеся разрушению):
- Radial Damage Vel Change (bool, по умолчанию False) — включить радиальный урон, как изменение скорости объекта.
- Damage Impulse (float, по умолчанию 800,0) — величина импульса при уроне, применяемая к объектам с симуляцией физики.
Destruction (разрушаемые объекты):
- Destructible Impulse (float, по умолчанию 800,0) — величина импульса при уроне, применяемая к разрушаемым объектам.
- Destructible Damage Spread Scale (float, по умолчанию 1,0) — величина силы распространения повреждения разрушаемых объектов.
В практическом примере ниже в статье для настройки автоматического импульса при уроне мы будем использовать свой пользовательский Damage Type Class с настройкой параметра Damage Impulse.
Unreal Engine Event Point Damage
Event Point Damage в Unreal Engine — это событие, вызываемое на Акторе, который получил точечный урон, переданный от объекта инициатора урона через функцию Apply Point Damage.
Данное событие кроме фактического урона, выраженного в числовом формате в параметре Damage, также предоставляет доступ к информации о конкретной точке попадания. Что позволяет создавать сложные и реалистичные реакции и эффекты повреждений:
- отображение частиц, декалей, пробоин в точном месте попадания;
- нанесение разного урона в зависимости от того, куда попала пуля (голова, торс, конечности);
- учёт брони в зависимости от точки попадания;
- влияние урона на геометрию в месте попадания.
В многопользовательских играх событие вызывается только на сервере.
Параметры события EventPointDamage
- Damage (float) — величина нанесённого урона.
- Damage Type (Damage object reference) — тип нанесённого урона.
- Hit Location (vector) — точка столкновения при уроне в координатах мирового пространства.
- Hit Normal (vector) — нормаль поверхности в точке попадания.
- Hit Component (ссылка на объект Primitive Component) — компонент, в который был нанесен урон.
- Bone Name (name) — имя кости скелета, в которую был нанесен урон (если он применяется для Skeletal Mesh).
- Shot from Direction (vector) — вектор направления удара при уроне (точка начала силы удара).
- Instigated By (Controller object reference) — контроллер, инициировавший урон.
- Damage Causer (Actor object reference) — Актор, непосредственно нанёсший урон.
- Hit Info (structure) — фактическая информация о столкновении при уроне. Возвращается в форме подробной структуры. Обычно данную структуру расшифровывают отдельной специализированной нодой результата столкновения, изучить которую Вы можете в отдельной статье: Break Hit Result.
Практика в Unreal Engine: создаём точечный урон персонажу с раздельным учётом повреждения головы, тела и защитного щита
Задача: при помощи функции ApplyPointDamage и события EventPointDamage произвести точечный урон персонажу с раздельным учётом повреждения его разных компонентов (головы, тела и защитного щита).
При попадании в голову Актор должен быть тут же удалён из игрового мира. При попадании в щит у Актора (самого персонажа) не должно быть никаких повреждений, но при этом должен пострадать сам защитный щит. После двух попаданий компонент щита должен быть разрушен и удалён, оголяя защиту персонажа. Для эффектности все повреждения должны сопровождаться небольшим импульсом и визуальным взрывом.
Настройка персонажа для нанесения точечного повреждения
- В данном практическом примере мы будем использовать проект на основе стандартного шаблона игры в Анрил Энджин (UE5) от первого лица с подключенной опцией стартового контента. Откроем вкладку Event Graph персонажа BP_FirstPersonCharacter и в ней вызовем событие нажатия клавиши Debug Key F, на котором опишем процесс повреждения врага.
- Итак, по нажатию на клавишу F создадим трассировочную линию из центра камеры персонажа по направлению вперёд, длинной 500 см, по каналу Visibility. Описывать логику создания трассировки я здесь не буду, так как разобрал её в отдельной статье, где Вы сможете подробно изучить данный процесс: Line Trace By Channel. По причине достаточно длинного кода урона, для удобства я сокращу его, перенеся логику трассировки в свою пользовательскую функцию MyFunc_LineTrace. Данная функция будет возвращать 1 параметр от ноды Line Trace By Channel и 3 параметра от Break Hit Result, необходимые нам для описания дальнейшей логики.
Скриншот
Код на BlueprintUE
Если код отображается без связей, нажмите сверху кода на кнопку «Graph»
- После трассировки, если было блокирующее столкновение, нодой Spawn Emitter at Location добавим визуальный эффект взрыва. В параметр Location которой, из ноды Break hit Result подадим координаты столкновения трассировочной линии с объектом, чтобы взрыв происходил непосредственно на месте урона. А в параметре Emitter Template выберем эффект взрыва P_Explosion (данный эффект доступен, только если к проекту добавлен Started Content от самого движка). Также через параметр Scale уменьшим масштаб эффекта до 0.5. Остальные параметры оставим по умолчанию.
- Далее функцией Apply Point Damage добавим точечный урон. В качестве целевого объекта, кому мы будем наносить повреждение, в параметре Damaged Actor укажем из ноды Break hit Result свойство Hit Actor, возвращающее ссылку на объект, с которым произошло блокирующее столкновение Line Trace.
- Для того чтобы настроить автоматический импульс при повреждении, необходимо создать свой класс типа урона. Итак, в Content Browser Unreal Engine создадим Damage Type Class с именем BP_MyDamageType. Откроем его и во вкладке Details изменим параметр Rigid Body / Damage impulse (сила импульса при уроне) на 30000. Остальные параметры оставим по умолчанию.
Укажем класс BP_MyDamageType в Apply Point Damage в параметре Damage Type Class.
- В параметр Base Damage установим значение урона, равное 20. Это то значение, которое мы будем вычитать из здоровья объекта.
- В Hit From Direction необходимо подать вектор направления импульса при повреждении, который будет применяться к объектам с симуляцией физики. Для этого воспользуемся параметром Impact Normal из Break hit Result, который возвращает вектор нормали в точке удара. Единственное, данный вектор нужно развернуть, так как нормаль удара расположена в обратную сторону от столкновения (отражение при столкновении). А нам, для придания импульса, наоборот нужен вектор по направлению удара. Поэтому этот вектор мы умножим на (-1.0), тем самым развернув его. Единственное, нужно умножать не на целое число (-1), а на дробное (-1.0), так как значения по осям вектора дробные.
- Среди обязательных параметров Apply Point Damage также числится структура Hit Info, которая полностью дублирует все значения Out Hit из Line Trace, соответственно, перебросим и эти значения.
- Оставшиеся параметры в Apply Point Damage в нашем случае уже можно не заполнять, так как в Акторе, получившем урон, ссылки на инициатора повреждения нам не нужны. Но для примера я всё же заполню. В Event Instigator необходимо подать контроллер, который наносит повреждение. Укажем там контроллер игрока, возвращаемый нодой Get Player Controller. И в параметре Damage Causer нужно указать Актор, который непосредственно произвел повреждение. В нашем случае это Актор текущего персонажа. Его нам возвратит нода Get a reference to self.
Скриншот
Код на BlueprintUE
Настройка врага для обработки события точечного урона Event Point Damage
- Создадим в Unreal Engine блюпринт BP_Enemy класса Actor, в Event Graph которого вызовем событие Event Point Damage для обработки урона с учётом раздельного повреждения каждого из компонентов.
- Настроим визуальный вид BP_Enemy: добавим ему компонент Cube для тела врага и увеличим его по оси Z. Также в панели Details в разделе Physics / Simulate Physics включим симуляцию физики для этого компонента. Данную настройку нужно включить обязательно, чтобы объектам предавался автоматический импульс при точечном уроне.
- Далее, дочерним по отношению к телу Cube, добавим компонент Sphere для имитации головы, уменьшим его и поднимем над телом. Также добавим еще один компонент Cube, опять же дочерним, по отношению к Cube тела, и оформим его в качестве щита.
- Для идентификации каждого из компонентов, добавим в компоненте головы во вкладке Details в разделе Component Tags тег head (голова), а в компоненте щита тег shield (щит).
- В BP_Enemy введём две переменные типа float: HP (здоровье персонажа), равное 100, и HP_Shield («здоровье» щита), равное 40.
- При срабатывании события Event Point Damage мы будем проверять его параметр Hit Component, то есть компонент, на который пришёлся удар. И проверять мы его будем нодой Component Has Tag на наличие определённых тегов. Для начала проверим наличие тега head, и если этот тег есть, то значит удар пришёлся на голову. А по условиям задачи при таком ударе Актор нужно удалить из игрового мира. Что мы и сделаем нодой Destroy Actor.
- Далее, если тега head нет, то проверим наличие тега shield (щит). И если такой тег находим, то вычитаем урон (значение параметра Damage события Point Damage) из переменной HP_Shield («здоровье» щита). После этого проверим HP_Shield, равна ли эта переменная 0. И если равна, то удаляем текущий компонент нодой Destroy Component, в которую подадим ссылку из Hit Component события Point Damage. Таким образом, так как «здоровье» щита изначально равно 40, а наносимый урон 20, то щит удержит 2 удара, после которых он будет удалён, а персонаж станет беззащитным.
- Ну и на последнем шаге нам останется вычесть урон из здоровья персонажа. Так как, если при проверке компонента мы не нашли ни тег head, ни тег shield, значит удар пришёлся на третий и последний компонент Актора — тело. Вычитаем урон точно так же, как и в пункте 7, только в качестве переменной здоровья используем HP. После обновления значения HP также необходимо проверить эту переменную, не стала ли HP равна 0. И если стала, значит здоровье персонажа закончилось, и мы удаляем весь Актор нодой Destroy Actor.
Скриншот
Код на BlueprintUE
Совет. Вскоре выйдет моя бесплатная книга по Blueprints для Unreal Engine в PDF формате. Как она выйдет, рекомендую её скачать, чтобы Вы детально изучили блюпринты Анрил Энджин.