Sobaka Studio가 9 Monkeys of Shaolin의 훌륭한 전투 시스템을 구현한 비결

Sobaka Studio 설립자 Dmitry Kachkov
Sobaka Studio의 대표인 Dmitry Kachkov는 러시아 발티스크에서 태어났습니다. 그는 IT 분야의 학위를 취득하고 SmachCars, PS3용 HamsterBall, Frontline Commando 등 여러 게임을 개발했으며 Creat Studio, Sperasoft, Glu Mobile 등의 비디오 게임 회사에서 경력을 쌓았습니다. 2016년 Kachkov는 Sobaka Studio를 설립했습니다. 이 개발사의 첫 작품은 진행형 격투 슈팅 게임 Redeemer였습니다. 첫 작품의 성공 이후 2020년 가을, Dimitry Kachkov와 그의 팀은 쿵푸 스타일 진행형 격투 게임 9 Monkeys of Shaolin을 출시했습니다.
안녕하세요. 저는 소바카 스튜디오(Sobaka Studio)를 설립한 드미트리 카치코프(Dmitry Kachkov)입니다. 저희 소규모 팀은 5년 이상 인디 진행형 격투 게임을 개발해 왔습니다. 이 장르의 게임플레이는 주로 전투 시스템과 밀접한 관련이 있습니다. 유명한 진행형 격투 게임에서는 플롯이나 환경보다 재미있고, 다양하고, 빠른 전투가 플레이어를 사로잡는 요소라는 걸 많은 분이 알고 계실 겁니다.

이는 저희 게임 리디머(Redeemer)와 신작 나인 몽키즈 오브 샤오린(9 Monkeys of Shaolin)에도 적용됩니다. 이 두 게임의 전투 시스템은 비평가로부터 큰 호평을 받기도 했습니다. 저는 이런 전투 시스템 스타일을 '맛깔난다'고 정의하는데, 이것이 무슨 뜻이며 어떻게 게임에서 이를 달성하는지 설명해 보겠습니다. 

리디머에서는 터프한 승려 바실리(Vasiliy)가 맨손으로 적들을 아주 멀리 집어던집니다. 나인 몽키즈 오브 샤오린에서는 주인공 캐릭터가 봉을 들고 수많은 적들과 싸우며 게임의 스킬 개발 시스템을 통해 전투 능력을 키워나가야 합니다.

두 게임의 풍부하고 '맛깔난' 전투는 내부에서 개발한 콤보 공격을 통해 이뤄냈습니다. 이를 언리얼 엔진으로 어떻게 구현했는지 살펴보겠습니다. 
 


콤보 공격 컴포넌트 컨피규레이션

초기에 '콤보 공격' 컴포넌트는 공격/타격 애니메이션을 재생하는 것이었습니다. 그러나 애니메이션 재생이 시작된 후에도 추가 조건, 이벤트, 트리거 등 많은 것이 이어집니다. 이는 맛깔나는 전투를 구현하기 위해 반드시 필요한 요소입니다. 저희는 이 방면을 오랜 기간 개발하며 수많은 추가 세팅에 따라 달라지는 하나의 거대한 시스템으로 만들었습니다. 이제는 한두 가지 옵션만 조정하면 '기본적인' 애니메이션 재생을 복합적인 액션 시퀀스로 바꿀 수 있습니다.

내부 함수에 대해 말씀드리기에 앞서 UObject 서브클래스에서 각 콤보 공격을 어떻게 구성했는지 보여드리겠습니다.
콤보 공격 조정 예시
콤보 공격에 사용된 세팅은 다음과 같은 카테고리로 나뉩니다.
  • 애니메이션: 캐릭터 및 무기 애니메이션입니다.
  • 디자인: 대미지, 치명타 확률, 출혈 대미지, 공격 방어 확률 등 게임플레이 세팅입니다. 플레이어가 진행하면서 얻게 되는 공격 능력치 모디파이어 목록도 만들었습니다.
  • 공격: 이 세팅은 공격 시퀀스와 애니메이션과 연결되어 있습니다. 효율적인 피해 반경, 타격 트레이싱을 담당하는 본의 이름, 적과의 거리(예: 공격을 시작하려면 얼마나 가까워야 하는지) 등입니다. 이 세팅은 애니메이터가 조정합니다.
  • 충전 타격: 강력한 타격을 위한 세팅입니다. 플레이어가 타격 버튼을 몇 초 동안 길게 눌러서 공격을 수행할 때와 같은 경우로, 충전 중에 어떤 특수 이펙트를 재생할지, 이 타격이 충전되면 어떤 타격을 사용할지 등을 결정합니다.
  • 콤보: 공격 애니메이션이 재생되는 도중에 플레이어가 버튼을 계속 누르면 현재 콤보를 지속하는 공격입니다.
  • 타격: 이 세팅은 공격이 성공할 때 적이 받는 대미지의 양과 재생되는 타격 애니메이션을 정의합니다. 여기에는 연기, 불 등의 이펙트에 관해 저장된 파티클 세팅과 오디오 파일, 적 깜빡임, 카메라 셰이크, 프리징 등이 포함됩니다. 타격을 받은 뒤 적의 반응(쓰러지는 애니메이션)을 설명하는 블루프린트도 연결되어 있습니다. 저희 게임에서는 적이 바닥에 쓰러져 있는 시간 등이 여기에 해당합니다.
 

공격 애니메이션

저희는 애니메이션 알림(이하 '알림'으로 통칭)을 적극적으로 활용하여 게임플레이를 조정하고 밸런스를 맞췄으며 비주얼과 사운드를 변경했습니다. 우선 기본 게임플레이 알림을 살펴보겠습니다. 이를 통해 게임 디자이너와 애니메이터 모두 멋진 게임플레이의 세부적인 요소를 꼼꼼하게 만들 수 있습니다.

대시 알림

공격 도중 플레이어는 적을 향해 대시할 수 있습니다. 여기에는 세 단계가 있습니다. 시작 애니메이션, 적을 향한 움직임, 타격입니다. 적이 플레이어 가까이에 있다면 이동 단계는 아주 빠르게 진행되거나 누락됩니다. 예를 들어 플레이어가 버튼을 누르면 캐릭터가 적을 바로 타격합니다. 그 시퀀스를 진행하기에는 적이 좀 멀리 있다면 시작 애니메이션을 재생하고, 그 애니메이션을 일시 정지한 뒤 플레이어를 적에게 가까이 이동시키고 일시 정지를 해제합니다. 그런 다음 타격을 재생합니다. 애니메이션을 일시 정지하거나 일시 정지를 해제하기 위해 알림을 사용합니다. 이렇게 하면 애니메이터가 플레이어와 적 사이의 거리를 수동으로 계산하지 않아도 됩니다. 

이를 고려하여 저희는 알림을 애니메이션이 일시 정지해야 하는 정확한 장소에 설정했습니다. 플레이어가 먼저 대시해서 적에게 도달할 수 있으면서도 캐릭터가 너무 오래 떠 있지 않도록 이런 알림의 위치를 계산했습니다. 그럼에도 효율성을 위해 플레이어는 약간 떠 있어야 합니다. 대시는 컴포넌트 내에서 플레이어의 최대 속도를 증대하고 대시 대상 지점(예: 자동 조준된 타깃)을 향해 강제로 이동시켜서 구현됩니다.
 

타격 구역 알림

공격 애니메이션 도중에 AOEAttackState 스테이트가 켜집니다. AOE는 이펙트 영역을 나타냅니다. 이 스테이트는 종종 과도하게 확대되기도 하는 무기 타격 구역 내에서 대략적인 타격 레이 트레이싱 계산을 활성화하여 적이 타격되었는지 판정합니다.     

AOEAttackState는 적에 대한 타격을 등록할 뿐 아니라 특수한 별도의 StrikeHit 애니메이션 알림 역할도 합니다. 이 알림이 활성화되면 플레이어 캐릭터 앞 일정 반경 내에 있는 적은 강제로 대미지를 입습니다. 모든 타격 세팅(예: AOE 스테이트에서의 트레이싱, StrikeHit 활동 도중의 타격 구역)은 현재 콤보 공격의 블루프린트에 저장됩니다. 여기서 디자이너는 여러 타격을 미세 조정할 수 있습니다.
 

다음 공격 알림으로 전환

타격 애니메이션 도중 ShortTick 애니메이션 알림(즉시 타격)이 표시될 수 있습니다. ShortTick 알림이 트리거되면 시스템은 현재 공격 시작 시에 공격 버튼이 눌리고 있는지 확인합니다. 공격 버튼이 눌린 경우 공격은 콤보 공격 블루프린트에서 구성된 대로 다음 공격으로 이어집니다. 다시 말해 공격의 블루프린트에는 다른 공격의 블루프린트에 대한 링크가 포함된다는 것입니다. 이 다른 공격은 ShortTick 활성화 순간에 타격 버튼 중 하나만 눌렸을 때 트리거됩니다. ShortTick은 콤보 타이밍을 미세조정하기 위해 여러 차례 설정될 수 있습니다.
 

취소 알림

취소 알림은 공격 애니메이션 구성을 종료합니다. 이 알림 그룹은 새 이벤트가 발생할 때 애니메이션을 취소할 수 있는 위치에 설정됩니다. 이 이벤트는 플레이어가 이동 버튼을 누르거나 대미지를 받는 경우 트리거될 수 있습니다. 예를 들어 슈퍼 타격이 활성화된 경우 약한 적은 공격으로 이를 저지할 수 없습니다. 그러나 활성 페이즈가 끝나고 캐릭터 모델의 아름다운 애니메이션이 종료되면 가해진 대미지가 공격 애니메이션을 저지하고 그 대신 타격 애니메이션을 시작하게 됩니다.
 

충전 공격 알림

저희 게임의 대다수 기술에는 '충전' 버전이 있습니다. 예를 들어 공격 버튼을 길게 누르면 캐릭터가 더 많은 대미지를 가하는 강화 공격을 실시합니다. 게임 내에서 타격은 아주 빠르고 신속하게 수행되지만 '충전' 공격을 수행하기 위해 공격 버튼을 길게 누를 수 있습니다. 따라서 플레이어를 수동적인 충전 상태로 두지 않기 위해, 저희는 애니메이션 속력 둔화 커브를 만들고 플레이어가 공격 버튼을 길게 누를 때 이를 활성화했습니다. 이에 따라 애니메이션 속력이 느려지고 필요한 충전량이 채워지면 특수한 비주얼 이펙트가 나타나며 타격이 두 배의 대미지를 가합니다.
This image shows off our SFX and VFX notifications.

기타 알림

앞서 말씀드린 게임플레이 알림 외에도 공격의 사운드 및 비주얼 컴포넌트를 담당하는 알림들이 있습니다. 이 알림들이 전체 그림을 완성합니다.
 
공격 하나에도 여러 사운드 이펙트가 포함됩니다. 무기 타격, 플레이어 걸음, 공격 시 기합, 플레이어가 공격 후 착지하는 소리 등 다양합니다. 저희 게임 내의 모든 캐릭터는 동일한 인간형 스켈레톤으로 구성되어 여러 캐릭터가 동일한 공격 애니메이션을 가질 수 있습니다. 그러나 서로 다른 사운드와 이펙트가 공격의 느낌을 완전히 다르게 만듭니다. 
 

타격 반응

적에 대한 타격이 감지되면 플레이어에게 피드백을 주는 반응이 있어야 합니다. 일반적으로 피드백은 강할수록 좋습니다. 그러나 그와 동시에 디자이너들이 관리할 수 있는 수준이어야 합니다.
각 콤보 공격은 타격 반응을 설명하는 블루프린트를 포함합니다.
아래 스크린샷을 보시면 적들이 무장 없음(Light), 무장(Medium), 중무장(Heavy)의 세 가지 유형으로 구분되는 것을 알 수 있습니다. 그러므로 동일한 타격도 적에 따라 반응을 다르게 설정할 수 있었습니다.
이는 즉각적인 솔루션은 아니었습니다. 처음에는 타격과 반응의 연결을 각 적의 블루프린트 내에 구성하려고 했으나, 그렇게 하려면 수백 개에 달하는 공격 클래스를 전부 열거해야 했습니다. 시간이 많이 걸리고 오류가 발생할 위험이 있습니다.
 
다음으로 저희는 타격 반응에 적의 클래스를 설정하려고 해 봤으나, 여기에는 그 반대의 문제가 있었습니다. 각 타격 반응마다 수많은 적을 열거하는 동시에 새 클래스를 생성할 때 이를 잊지 않고 추가해야 한다는 것입니다.

그런 링크를 생성하는 프로세스를 단순화하기 위해 저희는 적을 무장 없음, 무장, 중무장, 특수(Special)의 네 유형으로 나눴습니다. 특수 적은 타격을 특수 메서드로 처리하며, 일반 적은 자신의 유형에 따라 애니메이션과 세팅을 선택합니다. 이에 관해, 반응 애니메이션은 충전 공격 여부 외에도 적의 움직임을 차단하거나 적의 공격을 반격하는지에 따라 다양하게 나타날 수 있습니다. 예를 들어 중무장 적은 타격 애니메이션을 재생하더라도 언제든 공격을 결정하면 이 애니메이션을 저지할 수 있습니다. 아래 GIF를 참조하세요.

화려한 볼거리와 피드백

플레이어에게 생동감을 더 느낄 수 있도록 여러 부가 이펙트를 마련했습니다.
  • 카메라 셰이크: 적의 타격과 플레이어 타격 모두에 카메라 셰이크를 할당했습니다. 대부분의 경우 미세한 셰이크지만 플레이어에게 아주 강력한 타격이 가해졌다고 보이는 순간에는 셰이크가 강화됩니다. 
  • 파티클 이펙트: 저희는 다양한 이펙트를 중요하게 여겨 타격 이펙트(봉 공격, 돌풍, 기 에너지) 외에도 적 타격에 관한 다양한 이펙트를 구성했습니다. 중요한 적들에 대해서는 여러 타격 유형을 할당하는 것도 필요했습니다. 예를 들어 적이 대미지만 입는지, 아니면 타격을 받고 사망하는지에 따라 달라집니다. 저희는 종종 일부 세팅을 의도적으로 과장하여 게임이 보다 화려해 보이게 만들었습니다. 
  • 마이크로프리즈: 파티클 이펙트와 카메라 셰이크뿐 아니라 마이크로프리즈 또한 전투 시스템에 매우 중요합니다. 사실 이는 여러 인기 액션 게임에서 사용됩니다. 마이크로프리즈는 캐릭터와 적의 애니메이션이 정지하는 짧은 순간을 말합니다. 이러한 이펙트는 각 타격에 추가적인 중량감을 부여합니다. 물론 각 타격에는 이 이펙트가 신중하게 계산된 시간만큼 들어 있습니다. 적을 처치하면 이 이펙트가 단순 타격보다 더 오래 지속되고, 전투에서 마지막 적을 처치하면 그보다 더 오래 지속되며 완전히 정지한 느낌을 줍니다.

나인 몽키즈 오브 샤오린의 새로운 특징

나인 몽키즈 오브 샤오린의 디자인 특징을 강조하기 위해 저희는 전투 시스템에 몇 가지 혁신을 적용했습니다.
  • 무기 애니메이션: 애니메이터가 무기 애니메이션을 캐릭터의 타격 애니메이션과 동기화합니다.
  • 무기의 이동 궤적을 계산하는 타격 트레이싱: 저희 게임에서는 종종 타격이 굉장히 빨라서 불과 몇 프레임만에 끝나기도 합니다. 그와 동시에 무기가 아주 멀리 나가서 적을 관통할 때도 있습니다. 이런 일을 방지하기 위해 저희는 무기의 이동 경로를 계산하고 이를 세그먼트로 분리했습니다. 그런 다음 각 세그먼트마다 무기가 적과 겹치는지 확인했습니다.
  • 타격 개선: 공격 부스터: 공격은 여러 세팅을 포함하며 일부는 기본 대미지 방식과 많이 다르기 때문에 저희는 이런 특징을 개선하고 컨트롤을 플레이어에게 넘겨줄 방법을 마련했습니다. 예를 들어 세팅 중에는 플레이어의 자동 조준을 담당하고 공격을 수행하기 위해 플레이어와 적 사이의 거리를 계산하는 옵션이 있습니다. 이 값을 높이면 아주 흥미로운 결과가 나오며 전투 감각을 더욱 끌어올릴 수 있습니다. 

아래는 기본 발차기의 모습입니다.
 
다음은 강화된 발차기입니다.

결론

공격, 공격 스테이트, 적 유형 분류, 개별 애니메이션 세팅에 기울인 저희 팀의 노력 덕분에 개발하고자 했던 맛깔나는 전투를 달성할 수 있었습니다. 저희의 경험이 여러분의 게임 개발에 도움이 되기를 바랍니다. 블로그를 읽어 주셔서 감사합니다. 
 

    지금 언리얼 엔진을 다운로드하세요!

    세계에서 가장 개방적이고 진보된 창작 툴을 받아보세요. 
    모든 기능과 무료 소스 코드 액세스가 포함된 언리얼 엔진은 제작에 바로 사용할 수 있습니다.