Deeper Learning

[UE5] 보스 구현, 전투 시스템 고도화, 회고 (프로젝트ASR - 개발일지6) 본문

Game Development/Unreal Engine

[UE5] 보스 구현, 전투 시스템 고도화, 회고 (프로젝트ASR - 개발일지6)

Dlaiml 2024. 9. 29. 18:40

게임 개발에 대한 학습을 목표로 시작한 프로젝트이다 보니 구현한 기능들이 점점 늘어나고 있었다. 
하나의 프로젝트라기보다 앞으로의 게임 개발을 쉽게 하기 위한 코드 베이스, 보일러플레이트 만들기가 목표였고 이를 어느 정도 달성한 것 같아 프로젝트의 방향성을 조금 더 뾰족하게 다시 설정하였다.

 

보스와의 전투가 메인이 되며 가드와 회피를 통해 보스의 공격을 흘려내며 매우 강력한 대미지를 가진 보스를 공략하는 소울류 게임의 보스 전투 시스템의 일부를 차용하였다.

 

프로젝트 초기에는 TPS 캐릭터를 만들기 위해 콜 오브 듀티, 배틀그라운드, 배틀필드를 참고하며 무기 픽업 기능, 조준 기능, 탄창 시스템을 만들었으며 이후 액션 게임 캐릭터를 만들기 위해 데빌메이크라이, 팬텀 블레이드 제로, 베요네타를 참고하며 기본 콤보시스템, 공중 전투 액션, 전투 시스템을 개발했다.


이후 세키로, 엘든링을 참고하며 회피, 가드, 패링 시스템, 대미지 시스템, AI 순찰 - 추적 - 전투 시스템을 개발하였으며 보스도 이에 맞춰 구현하였고 이를 현 프로젝트의 주요 전투 시스템으로 확정하였다.

 

캐릭터 스왑 기능, TPS 게임 관련 피쳐를 제거하고 검을 사용하는 캐릭터를 메인 캐릭터로 설정. 속도가 빠르고 화려한 스킬들을 배제하고 회피와, 가드 시스템 개발에 집중하였다.  아래는 최근 개발한 보스 전투 테스트 영상이다. 

 

 

 

전투 시스템 고도화

 

- 적 체공 이후 콤보 시스템 간소화

 

적을 공중으로 띄우고 연속적으로 공격을 빠르게 가하면서 콤보를 화려하게 이어가는 데빌메이크라이 5 식의 전투를 구현하기 위해 적을 띄우는 스킬, 공중 콤보를 구현했었다. 이를 보스가 아닌 일반 적과의 전투에서만 활용하도록 제한하였다.

 

- 보스 피격 애니메이션 생략

 

소울시리즈 게임의 보스는 특정 조건을 만족하지 않으면 경직 상태에 빠지지 않고 피격 애니메이션 또한 재생되지 않는다. 보스가 플레이어의 콤보 공격에 연속으로 피격당하며 아무것도 할 수 없는 것을 원하지 않았기 때문에 BossEnemy 클래스를 BaseEnemy를 상속받도록 하였고 피격 애니메이션을 일반 상황에서 스킵하도록 하였다.

 

- 가드 시스템 재설계

 

플레이어는 보스의 공격 이후 딜레이를 캐치하여 공격해야 하며, 이후 다음 공격으로 들어서기 직전에 공격을 가하면 보스는 공격 방향, 현재 스태미나 상태, 가드 확률에 기반하여 가드를 시전 한다.

 

보스 피격

 

보스는 가드 상태에서 플레이어의 공격에 의해 체력 대신 스태미너를 소모한다. 가드 상태에서 공격이 누적되면 점점 보스의 '가드리벤지' 애니메이션이 재생될 확률이 증가한다. 

 

가드리벤지

 

모든 플레이어 공격 애니메이션은 공격 이후 딜레이가 있어 한 번에 많은 스태미나를 깎으려고 공격을 이어가다 보면 가드가 불가능한 상태에서 보스의 큰 공격을 받게 된다. (가드리벤지는 위 Gif의 공격 이외에도 플레이어와 거리를 벌리는 회피 모션 등 5개의 패턴이 있다)

 

고도로 숙련된 플레이어의 경우 보스의 모션을 보자마자 반응하여 회피 또는 가드 할 수 있도록 보스의 애니메이션 시작부터 공격 판정 시간을 플레이어의 가벼운 공격(일반공격 1~2타) 후딜레이 + 가드 준비 시간과 비슷하게 설정해 두었다. (5~7 프레임 미만의 짧은 시간에 입력이 이루어져야 한다)

 

세키로의 체간과 비슷한 시스템으로 스태미너를 모두 소모하면 가드 할 수 없게 된다. 가드 도중 스태미너가 0이 되면 가드가 해제되는 경직 애니메이션을 재생하도록 하였다.

 

가드브로큰

 

보스의 스태미너가 0이 되어 가드브로큰 상태에 빠지기 이전에는 플레이어는 보스의 공격 이후 딜레이 때 대미지를 줄 수 있지만, 보스가 가드브로큰 상태에 있다면 이전 공격의 후딜레이 + 보너스 프레임 + 다음 공격의 선딜레이 까지 대미지를 줄 수 있는 상태가 된다.

 

- 플레이어 스태미너 시스템

플레이어도 가드, 회피를 시전 하면 스태미너를 소모한다. 가드 상태에서 적의 공격을 막아내고 스태미너를 소모한다. 

회피는 발동이 조금 느리고 다음 동작까지 무적 판정이 사라지는 시점이 있어 연속 공격을 받아내기가 쉽지 않지만 스태미너 소모가 적고, 가드는 발동이 빠르고 패리가 가능하지만 가드 시 스태미너가 추가로 소모되며 후방은 가드 되지 않아 보스가 플레이어를 통과하며 공격하는 패턴을 막을 수 없도록 하였다.

 

- 패리(저스트가드) 시스템 고도화

Enemy 클래스에만 구현되어있던 패리 시스템을 플레이어 클래스에도 추가하였다. 따로 패리 버튼을 만들지 않고 세키로처럼 타이밍에 맞게 가드를 시전 하는 '저스트가드'를 패리로 취급하였다.

 

가드 시작 애니메이션에서 가드 애니메이션으로 넘어가는 시점에 짧게 Anim Notify State를 사용하여 플레이어의 HitReaction 상태를 Default에서 Parry State로 변경하도록 하였다. 

 

회피 / 패리

 

해당 시점에 공격을 방어하게 되면 넉백과 가드 히트 애니메이션 대신 패리 카운터 애니메이션을 재생하도록 하였다.

전투에서 가장 리스크가 크고 어려운 스킬이기 때문에 극적인 연출을 위해 패리, 패리 카운터 이펙트, 사운드를 따로 만들었으며 Radial Blur 필터, Camera Shake, Camera Arm Length 변경, Time dilation, Hit Stop를 적용하고 값을 조절해 가면서 플레이어에게 충분한 리턴을 줄 수 있도록 하였다.

 

- 스페셜 회피 추가

보스의 가장 강력한 연속 공격에 피격당하면 경직 애니메이션 재생시간보다 다음 공격 판정이 빨라 연속적으로 모든 공격을 받게 된다. 플레이어에게 이를 대응할 수 있도록 스태미너를 크게 소모하면서 시전 가능한 회피를 추가하였다. Knockout 상태와 Flinching 상태로 구분하여 플레이어가 큰 공격에 나가떨어져 누워있는 상태가 아닌 서있는 상태에서 경직에 걸린 상태에서 발동가능하도록 하였다.

 

 

 

보스 추가

전투 시스템을 설명할 때 이미 등장하였지만, 보스를 추가하였다. 순찰, 추적, 공격 3개의 스테이트로 이루어진 간단한 Behavior Tree 대신 보스를 위한 Behavior Tree, Blackboard를 새로 설계하였다.

 

Boss Behavior Tree

 

지정된 루트를 돌아다니며 AI Perception에 의하여 적을 탐색하는 순찰 상태, 소리나 시야  Sense에 노출된 적의 위치 주변을 배회하는 탐색 상태를 그대로 사용하였으며 전투와 관련된 Behavior Tree에서 많은 것들을 추가하였다.

 

우선 플레이어와의 거리를 기반으로 근거리, 중거리, 원거리 공격을 실행할 수 있도록 하였다.

각 공격 타입에 해당하는 Sequence 노드에 거리를 판단하는 Decorator를 추가하여 상위 Selector에서 거리에 맞는 공격 타입 Sequence를 실행할 수 있도록 하였다.

 

보스와 플레이어의 거리가 계속 유지되면 서로 근접 공격, 원거리 공격만 반복하는 등 전투가 단조로워지기 때문에 플레이어와의 거리가 크게 변하는 패턴을 각 공격 타입에 모두 하나 이상 배치하였다.

 

 

보스의 다음 공격을 기다리며 보스와 대치할 수 있도록 플레이어의 공격이 닫지 않는 거리에서 Strafe 하도록 하였다. 

 

EQS를 사용하여 Strafe를 구현하여 플레이어 주변을 기준으로 원을 그리고 Path가 존재하는 위치로 필터링, Distance로 점수를 주어 너무 가깝지 않으면서 플레이어에게 다가가거나 옆으로 이동할 수 있도록 하였다.

 

공격 범위에 들어오면 바로 공격을 수행할 수 있도록 Observer aborts를 Self로 설정하여 바로 Strafe를 종료할 수 있도록 하였다.

 

 

보스의 공격 애니메이션의 경우 사전 준비동작이 있는 애니메이션을 주로 활용하였으며 사전 준비동작이 따로 없는 경우 Custom time dilation을 활용하여 공격을 위해 준비하는 프레임을 늘리거나 보스의 대검에 푸른 전기 이펙트가 미리 둘러지는 등 플레이어가 확실히 인지할 수 있도록 하여 예측이 불가능한 공격에 피격당하는 불쾌감을 느끼지 않도록 하였다.

 

전체 플레이영상을 보면 보스가 빙글빙글 돌면서 검을 세 바퀴 돌리고 내려찍는 근접 공격 패턴이 있는데 이는 플레이어의 스태미너를 거의 소모시킨다. 해당 스킬의 경우 두 번 연속으로 등장하게 되면 플레이어는 죽음에 가까운 큰 대미지를 입게 되기 때문에 따로 쿨다운 시스템을 만들어 관리하였다.

 

 

보스의 공격 시작부터 공격까지의 프레임은 엘든링과 세키로의 보스 패턴을 프레임 단위로 보면서 비슷하게 맞추었다. 

플레이어의 체력, 스태미너 / 보스의 체력, 스태미너 / 플레이어와 보스의 대미지와 피격 시간은 직접 수백 번 플레이하면서 조정하였다.

 

원하는 난이도는 초심자가 20번 정도 트라이하면 처치 가능한 난이도였고 직접 플레이했을 때 패턴을 모두 알고 있음에도 4번 실패하고 5번째 도전하여 클리어했다. 

 

후기

언리얼 엔진을 공부하기 시작한지 100일 정도가 되었을 때, 처음 개인 프로젝트를 시작했고 이제 전투 프로토타이핑을 완료하였다.

 

게이머로서 플레이 하던 게임에서 한 번도 생각해보지 못한 포인트들을 개발하면서는 많이 생각하고 참고하게 된다.

보스의 포커스를 플레이어에게 맞춰놓다 보니 보스가 공격 이후 제자리에서 바로 뒤를 돌아 플레이어를 바라보았다. 만들고 보니 매우 어색하여 다른 게임에서 보스가 자신의 뒤로 이동한 플레이어를 어떻게 바라보는지 참고하였는데, 뒤를 공격하면서 회전하는 모션이나, 다음 공격을 이어가며 발을 드는 타이밍에 루트 자체를 회전시키는 것을 보고 이를 그대로 옮겨왔다. 이외에도 많은 것들을 결정하는데 타 게임을 참고하였으며 여러 게임의 전투시스템을 섞어 이번 프로젝트의 전투 시스템을 만들었다. 

 

게임을 만들기 위해서는 코드 작성 이외에도 중요한 것들이 매우 많다고 다시 느꼈다. 

Comments