- Unreal Engine Apply Damage
- Параметры функции Apply Damage
- Unreal Engine Event Any Damage
- Параметры события Event Any Damage
- Отрицательный урон. Лечение персонажей функцией Apply Damage и событием Event Any Damage
- Практика в Unreal Engine. Базовая система нанесения урона и лечения.
- Актор нанесения положительного и отрицательного урона
- Apply Damage: нанесение урона
- Event Any Damage: обработка урона
Друзья, приветствую, с Вами Будуев Антон. В данной статье мы обсудим базовый урон (повреждение) в Unreal Engine (UE4, UE5). А именно функцию нанесения урона Apply Damage и событие получения любого урона Event Any Damage. Данные ноды всегда работают в паре, поэтому рассматривать их будем совместно в одной статье. Но начнём мы с разбора функции нанесения урона, так как именно она и является инициатором этого процесса.
Вскоре выйдет моя бесплатная книга по Blueprints для Unreal Engine в PDF формате. Как она выйдет, рекомендую её скачать, чтобы Вы детально изучили блюпринты Анрил Энджин.
Unreal Engine Apply Damage
Функция Apply Damage в Unreal Engine является частью системы обработки урона. Она предназначена для нанесения урона другому Актору путём вызова в нём специализированного события Event Any Damage, которое мы рассмотрим ниже и передачи этому событию необходимых параметров наносимого урона.
Функция запускает процесс урона только тогда, когда её параметр базового урона Base Damage не равен нулю.
То есть основная цель функции Apply Damage — уведомить Актора, принимающего урон, о произошедшем событии и, если этот Актор реализует у себя событие Event Any Damage, то передать ему соответствующие параметры этого повреждения.
Саму функцию можно вызывать в любых Blueprint-классах, но, если рассматривать многопользовательские игры, то только на сервере.
Важно также отметить, что в Анрил Энджин имеются и другие функции для нанесения точечного и радиального урона, которые способны наносить эффекты от урона практически в автоматическом режиме.
Данная же функция Apply Damage применяется тогда, когда необходимо описать нанесение повреждения в коде вручную, например, убавить количество здоровья у персонажа, выраженное в пользовательской переменной Health.
Параметры функции Apply Damage
- Damaged Actor (Actor object reference) — Актор, который получает урон. Это основной параметр, определяющий, на кого будет оказано воздействие.
- Base Damage (float) — величина урона, который нужно нанести.
- Event Instigator (Controller object reference) — контроллер Актора, который вызвал нанесение урона (не всегда совпадает с DamageCauser). Например, контроллер игрока, который стреляет из оружия.
- Damage Causer (Actor object reference) — Актор, который непосредственно наносит повреждение, например, граната, пуля, меч.
- Damage Type Class (reference class) — класс, описывающий тип наносимого урона. Часто используется в других подвидах данной функции (точечного и радиального повреждения).
- Return Value (float) — (исходящий параметр) фактический урон, который в конечном итоге был нанесён Актору.
Unreal Engine Event Any Damage
Событие Event Any Damage в Unreal Engine вызывается в момент получения любого урона Актором, если нода данного события физически расположена в Event Graph этого Актора.
Работает событие только на сервере.
Важно понимать, что после вызова Event Any Damage никаких процессов в автоматическом режиме не запускается. Данное событие существует для того, чтобы разработчик мог описать логику нанесения урона сам, вручную.
Параметры события Event Any Damage
- Damage (float) — величина нанесённого урона.
- Damage Type (Damage object reference) — тип нанесённого урона.
- Instigator By (Controller object reference) — контроллер, инициировавший урон.
- Damage Causer (Actor object reference) — Актор, непосредственно нанёсший урон.
Отрицательный урон. Лечение персонажей функцией Apply Damage и событием Event Any Damage
Функцией Apply Damage и событием Event Any Damage в движке UE5 (UE4) часто пользуются не только в классическом виде для нанесения и получения урона, но и для обратной ситуации, для лечения персонажа.
Дело в том, что когда мы наносим урон, то в параметр Base Damage мы должны прописать количество наносимого урона. Так как изначально это функция нанесения урона, то обычно количество урона описывается положительным числом.
Например, у персонажа имеется переменная здоровья Health = 100. Если мы нанесем урон персонажу, где Base Damage = 60, то при срабатывании событии урона в персонаже нам нужно из переменной Health вычесть урон 60.
Health - Base Damage = 100 - 60 = 40
Итого у персонажа останется 40 единиц здоровья.
Но можно ведь пойти и в обратную сторону, и нанести ему отрицательный урон. То есть, наоборот, излечить персонажа на величину отрицательного урона. Например, персонаж берёт аптечку, а она, в свою очередь, наносит ему отрицательный урон в 60 единиц. То есть, в этот раз Base Damage будет отрицательной величиной = -60. Тогда в этом случае при срабатывании в персонаже события урона Event Any Damage формула у нас получится такой:
Health - Base Damage = 40 - (-60) = 40 + 60 = 100
Таким образом, Apply Damage и Event Any Damage используются не только для нанесения урона, но и наоборот для лечения (отрицательного урона).
Давайте разберём эту ситуацию на практическом примере.
Практика в Unreal Engine. Базовая система нанесения урона и лечения.
Задача — при помощи функций урона Apply Damage и Event Any Damage реализовать в Unreal Engine базовую систему нанесения урона и лечения персонажа.
Для текущей практики используем в Unreal Engine стандартный шаблон игры от третьего лица.
Актор нанесения положительного и отрицательного урона
- Создадим Blueprint BP_Damage класса Actor, который будет наносить персонажу как положительный, так и отрицательный урон.
- Добавим внутрь BP_Damage компонент Cube.
- Создадим переменную Base Damage, типа float для сохранения значения наносимого урона. В свойствах Details этой переменной изменим параметр Instance Editable в значение True, чтобы мы могли менять урон непосредственно на игровом уровне. Либо же, что ещё проще, можно открыть глазик напротив этой переменной.
- Перенесём BP_Damage на игровой уровень и в свойствах перенесённого объекта у нашей переменной Base Damage введём значение урона равное 10. Данный объект будет наносить урон персонажу.
- Вновь перенесём BP_Damage на игровой уровень. Для визуального удобства увеличим компонент Cube по оси Z. Также в этом объекте переменной Base Damage введём уже отрицательное значение урона, равное (-10). То есть данный объект, наоборот, будет восстанавливать здоровье персонажа.
Apply Damage: нанесение урона
- Во вкладке Event Graph Актора BP_Damage добавим событие Event Hit, которое срабатывает при столкновении текущего Актора с другим объектом. В нашем случае при этом столкновении мы будем отправлять урон этому объекту.
- Отфильтруем столкнувшиеся объекты с текущим Актором на столкновение только с игроком. Сделаем это при помощи сравнения столкнувшегося Актора с Character игрока, который возвращает функция Get Player Character. И если они равны, то с BP_Damage столкнулся именно игрок, а значит, продолжаем процесс нанесения урона далее.
- Физических столкновений буквально за доли секунды может быть очень много, поэтому их нужно ограничить. Для этого введём ноду блокировки потока Do Once, благодаря которой последующий код выполнится строго только 1 раз. Впоследствии, после нанесения урона и задержки в 0.2 секунды, которую произведёт функция Delay, сбросим блокировку Do Once, чтобы при следующем столкновении через 0.2 секунды можно было вновь нанести урон.
- После Do Once функцией Apply Damage введём нанесение урона. В параметр Damaged Actor подадим Актор Other из Event Hit, который столкнулся с нашим объектом.
- Также заполним параметр Base Damage, подав туда нашу пользовательскую переменную Base Damage, которую мы создавали ранее. В этой переменной будет находиться количество урона с положительным значением (сам урон), либо отрицательным (лечение).
- Ну и напоследок, в параметр Damage Causer (ссылка на Актор, нанёсший урон) подадим ссылку на текущий Актор, которую возвратит функция Get a reference to self. По идее, в нашем текущем примере данный параметр можно не заполнять, так как мы описываем простую, базовую систему урона. И ссылка на Актор, нанёсший урон, не нужна. Но в более сложных системах она точно необходима, например тогда, когда мы этому Актору, нанесшему положительный или отрицательный урон, захотим отправить какую-то обратную информацию (к примеру, остаток от неиспользованной аптечки).
Скриншот
Код на BlueprintUE
Event Any Damage: обработка урона
- Систему обработки урона будем реализовывать в Event Graph персонажа BP_ThirdPersonCharacter. Но для начала в этом персонаже необходимо ввести переменную его здоровья. Для этого создадим переменную HP типа float и назначим ему значение по умолчанию в 100 единиц.
- Вызовем в персонаже событие Event Any Damage, которое сработает при нанесении персонажу любого урона.
- В данном событии значение количества урона в параметре Damage будет приходить как положительным (при реальном уроне), так и отрицательным (при лечении). Необходимо разделить последующий поток процесса по знаку урона (положительный или отрицательный), так как последующая обработка будет немного разной. Чтобы разделить потоки, воспользуемся нодой Compare Float, которая сверяет значение Damage с 0 и в зависимости от знака урона разделяет потоки процесса.
- Далее, если урон положительный, то вводим дополнительное ограничение — убавляем здоровье только тогда, когда здоровье персонажа (переменная HP) больше 0.
- Аналогичное ограничение вводим, когда урон отрицательный — прибавляем здоровье, только если переменная HP меньше 100.
- После ввода ограничений остаётся из текущего значения здоровья HP убавить урон (прибавить здоровье) из параметра Damage события Event Any Damage. Ну и далее обновить значение здоровья функцией Set HP.
Скриншот
Код на BlueprintUE
Описанная выше система нанесения урона при помощи Apply Damage и Event Any Damage в Unreal Engine является самой простой и базовой. Далее её можно усложнять.
Например, ввести остатки аптечки, когда она используется не полностью. То есть, к примеру, аптечка предоставляла 30 единиц здоровья, но мы истратили только 10 и здоровье стало равно 100. Тогда остаток в 20 единиц мы можем вернуть обратно в аптечку, использовав ссылку на Актор аптечки в параметре Damage Causer события AnyDamage. Предварительно создав в аптечке соответствующую интерфейсную функцию.
Также можно отследить, когда здоровье станет равно 0 и после запустить соответствующие события анимации персонажа.
Совет. Вскоре выйдет моя бесплатная книга по Blueprints для Unreal Engine в PDF формате. Как она выйдет, рекомендую её скачать, чтобы Вы детально изучили блюпринты Анрил Энджин.