Боевая система
Боевая система является не столько дискретной, сколько абстрактной: она представляет собой сложное взаимодействие нескольких различных систем, работающих вместе, при этом сложность реализации в значительной степени зависит от общей сложности проекта.
Проект игры довольно простой. Игрок может атаковать противников лишь одним способом — прыгая на них сверху. Противники же могут атаковать игрока уже двумя разными способами: в зависимости от противника это может быть ближний бой или непосредственный контакт.
Атака игрока и атака противника в ближнем бою в основе своей практически одинаковы. У вас будет один или несколько хитбоксов, размещённых на скелетной сетке персонажа в зависимости от того, как он может атаковать в ближнем бою, а также один или несколько хёртбоксов, чтобы приблизительно обозначить область, которую нужно будет протестировать на попадание.
Для контактной атаки противника мы будем использовать объект коллизии его капсулы, чтобы проверять, выполнил ли игрок контакт с ним, после чего будем выполнять те же действия по попаданию, что и для ближнего боя. Реализацию того, что происходит, когда по персонажу попадают, вы можете найти в базовом классе персонажа: Parrot\Source\Parrot\Public\Character\ParrotCharacterBase.h. Функциональная логика находится здесь и в подклассах ParrotPlayerCharacter.h и ParrotEnemyCharacterBase.h.
Персонаж игрока
Настройка игрока отличается тем, как игрок будет действовать при атаке противника. Когда игрок пересекается с хёртбоксом противника, противник передаёт игроку эту информацию, чтобы узнать, корректно ли была выполнена атака. В этом случае проверяется, находится ли игрок над верхней частью хёртбокса, что позволит убедиться, что игрок приземляется именно сверху, а не наносит удар сбоку или снизу. Если атака была выполнена корректно, противник передаёт сигнал игроку совершить прыжок. Если игрок будет удерживать кнопку прыжка в момент соприкосновения с хёртбоксом противника, он подпрыгнет ещё выше. Если же игрок отпустит кнопку прыжка перед контактом с хёртбоксом, прыжок будет не таким высоким.
Вражеский персонаж
Настройка противника будет чуть более сложной по нескольким причинам. Необходимо, чтобы атаки ближнего боя выглядели реалистично, поэтому хёртбоксы врагов расположены по краям их оружия. Настройки хитбоксов, хёртбоксов и коллизии капсулы вы можете найти в окне просмотра схемы вражеского персонажа, как, например, вот здесь: Blueprints > Enemy > Skeleton > BP_EnemyCharacter_Skeleton.
В этом примере вы можете увидеть хёртбокс на голове противника, хитбокс на его оружии и коллизию капсулы. Каждый из этих триггеров передаёт свои события пересечения родительским функциям в базовом классе персонажа.
Кроме того, анимации атаки отправляют события уведомления, которые активируют хитбоксы оружия только во время той части анимации, когда выполняется замах оружием. Это и позволяет добиться эффекта, словно игрок действительно получает удар, наносимый оружием, а не просто сталкивается с противником и получает урон в случайный момент времени. Эти уведомления анимации вставляются в анимацию атаки в конкретные моменты, чтобы в нужное время включать и отключать хёртбокс. Уведомления анимации вы можете найти по пути Blueprints > Enemy/EnemyBase > BP_AnimNotify_EnemyAttackBegin и Blueprints > Enemy > EnemyBase > BP_AnimNotify_EnemyAttackEnd, где настройка выполняется в анимации атаки конкретного вражеского персонажа, к примеру вот здесь: Assets> Quaternius > PirateKit > Characters > Headless_Skeleton > Animations > Characters_Skeleton_Headless_Anim_CharacterArmature_Sword.
Именно вражеский персонаж проверяет наличие пересечения и запускает события: при обнаружении пересечений противник запускает как собственную функцию HitCharacter(), так и функцию HitCharacter() игрока.
Код, обрабатывающий пересечения хитбоксов и хёртбоксов, вы можете найти здесь: Parrot\Source\Parrot\Public\Character\ParrotEnemyCharacterBase.h в функциях HitBeginOverlap() и HurtBeginOverlap().
Боевая система с боссами
Для боя с боссом предусмотрены дополнительные возможности: когда босс получает удар от игрока, воспроизводится последовательность «ярости». Код схемы Blueprint, запускающий ответную реакцию босса, вы можете найти вот здесь: Blueprints > Enemy > BossShark > BP_EnemyCharacter_BossShark.
Последовательность «ярости» — это простая последовательность с привязкой ко времени, в которой сначала воспроизводится предварительная анимация «встряхивания головой», за которой следует увеличение скорости ходьбы босса и активация компонента зелёного пламени Niagara для создания визуальных эффектов. Во время этой последовательности дополнительно отключается хитбокс, чтобы сделать босса неуязвимым.