취재

[NDC 17] 던파는 '유저같은' 움직임의 PVP AI를 어떻게 만들었을까?

테스커 (이영록) | 2017-04-26 14:08:27

<던전앤파이터>는 2016년 8월, 결투장의 아케이드 모드인 '시즈키의 도장'을 업데이트하고 많은 유저들에게 긍정적인 피드백을 받았다. 시즈키의 도장에서 유저들은 결투장 유저처럼 움직이는 AI를 만날 수 있었고, 아케이드 모드를 통해 결투장 실력을 단계적으로 향상시킬 수도 있었다. 

 

대전 액션 게임에서 '유저'같은 움직임을 보이는 AI를 만들기 위해서는 반드시 머신러닝이나 딥러닝과 같은 고도의 기술이 필요할까? <던전앤파이터> 개발실 콘텐츠 프로그램팀의 임희종 강연자는 누구나 구현 가능할 정도로 쉬워, 바로 써먹을 수 있는 '현실적인 대전 액션 게임 AI' 제작 방법을 소개했다. / 디스이즈게임 이영록 기자


 

 <던전앤파이터> 개발실 콘텐츠 프로그램팀 임희종 강연자

  

 

# 대전 액션 게임의 AI, 고려해야할 것들은?

 

대전 액션 게임에는 저마다 여러 개의 스킬을 가진 많은 캐릭터가 등장한다. 게임에 따라 캐릭터가 움직일 수 있는 범위가 X축, Y축으로 한정되기도 한다.​ 플레이어는 캐릭터마다 가진 스킬을 연계해 다양한 콤보를 만들어내고, 움직임으로 변수를 만들어내는 등 치열한 눈치싸움을 통해 대전을 이어나간다.

 

<던전앤파이터>는 10년 역사를 담은 게임답게 각각의 요소가 방대하다. 15개의 캐릭터와 51개의 전직, 약 8,000개의 스킬을 가지고 있으며 X,Y,Z 축으로 구성된 무빙이 있다. 또 다양하고 화려한 공중 콤보, 스탠딩 콤보, 다운 콤보가 있고 무한 콤보를 방지하기 위한 보정 시스템이 추가되어 있다. 

 

​그만큼 다른 대전 액션 게임보다 고려해야 할 것도 많다. 직업, 스킬, 쿨타임, 콤보, 무빙, 보정 등 ​유저같은 움직임의 결투장 AI를 만들기 위해서는 가능한 모든 변수를 고려해야 한다. 

 

 

 

# '시즈키의 도장' 세부 목표와 개발 방향성

 

시즈키의 도장의 목표는 단순히 '유저'같은 움직임의 AI를 만들어 결투하게 하는 것으로 끝이 아니었다. 유저가 모든 직업의 AI 캐릭터와 싸울 수 있게 하는 것은 물론, 유저의 콤보 학습을 도와줄 수 있어야 했다. 그러기 위해서는 유저별 결투장 숙련도에 따라 차등적인 난이도의 AI를 제공할 수도 있어야 했다. 

 

그렇게 '시즈키의 도장'의 개발에 4가지 목표가 정해졌다. 

 

첫 번째. 유저는 모든 전직의 캐릭터와 AI 대전 진행이 가능해야 한다. <던전앤파이터>에 존재하는 51개 전직의 AI를 만들어야 한다는 의미다. 

 

두 번째. 유저의 콤보 학습을 도와야 한다. 단순히 유저가 인형을 치며 콤보를 연습하거나 스스로 콤보를 개발하도록 하는 형태가 아니다. 다양한 콤보를 직접 보면서 습득할 수 있어야 했고, 또 실제 전투 상황에서 상황에 맞는 콤보를 구사할 수 있어야 했다. 그러기 위해서는 AI에도 다양한 콤보를 만들어 넣어야 했다.

 

 AI의 콤보 영상

  

세 번째. AI는 유저와 같은 무빙을 해야 한다. 결투장에 숙련된 유저는 상대방과의 거리를 잰다. 상대가 보유한 스킬의 사거리, 범위를 숙지하고 이를 예측하며 움직인다. 유저와 같은 무빙을 하기 위해서는 AI가 유저의 공격 범위를 예측하고, 유저의 상태를 체크할 수 있어야 했다.

 

네 번째. AI는 3가지 난이도가 제공되어야 한다. <던전앤파이터> 결투장 실력 분포에 따르면 하수는 약 600점, 중수는 약 800점, 고수는 약 1,000점에 위치해 있다. '시즈키의 도장'의 AI는 유저 실력 분포에 따른 난이도를 제공할 수 있어야 했다.  

 

​시즈키 도장의 세부 목표 4가지

 

 

# 목표를 비교적 간단한 방법으로 달성하다

 

'시즈키의 도장'은 다소 어렵게 느껴질 수 있는 네 가지 목표를 비교적 간단한 방법으로 달성했다. 

 

첫 번째 목표인 '51개 전직별 캐릭터 AI 추가'는 국민 스크립트라 불리는 '루아'로 해결했다. 루아를 사용해 매우 복잡도가 높은 콘텐츠에 대해 기획자가 바로 로직을 짤 수 있도록 설계했다. ​ 

 

두 번째 목표인 '유저의 콤보 학습'은 '키스트림 기반의 콤보'를 통해 해결했다. 기획자가 여러 형태의 콤보를 입력하면, 이 키입력을 파일로 저장하는 방식으로 AI의 콤보를 만들어 냈다. 저장한 콤보는 AI로직에 따라 재생되도록 했다. 상대가 떠 있는 상태면 공중 콤보인 'A콤보'가 사용되고, 상대가 누워있는 상태에서는 'B콤보'가 사용되게 하는 방식이다. 

 

 키스트림 기반 콤보

  

세 번째 목표인 '유저와 같은 무빙'은 '위험영역'을 설정하는 것으로 해결했다. '무빙'이란 나는 맞지 않고 때리려는 움직임의 연속이다. 맞지 않으려면 적의 공격 영역을 알고 있어야 한다. 그래서 '시즈키의 도장'에 등장하는 AI에는 스킬별 공격 데이터를 정의했다. 

 

그리고 AI가 위험영역에 따라 자동으로 거리 조절을 하게끔 설정했다. AI가 상대하는 유저가 범위가 큰 스킬을 가지고 있으면 유저와 거리를 벌렸고, 해당 스킬이 쿨타임이면 위험영역(Warnning Area)이 꺼져(Off) 그만큼의 거리를 조절하며 이동했다. 위험영역은 AI스크립트에 '이벤트'로 전달돼 기획자 필요에 따라 로직으로 처리된다. 이를 통해 AI에서 유저와 비슷한 움직임이 재현됐다. 

 

유저와 비슷한 AI의 움직임을 만들기 위해 위험영역에 FSM을 정의했다. AI는 상대의 위험영역에 들어서면 공격할지 회피할지를 결정한다. 그리고 공격하기로 결정하면 무작정 콤보를 이어가는 것이 아니라 Checkstate로 전환됐다. Checkstate는 일종의 '견제'다. 공격 성공 시 콤보를 연계할 수 있는 딜레이 짧은 어퍼류 스킬을 시전하는 상태다. 

 

 위험영역 AI반응

  

이 결과로 '시즈키의 도장'의 AI는 유저의 위험영역을 체크하다가 위험영역에 들어서 공격하기로 결정하면 견제를 한다. 이후 견제가 성공하면 자동으로 콤보를 실현한다. 콤보 중 강제기상, 강제다운 보정에 가까워지면 강력한 마무리 일격을 가한다. 

 

이렇듯 위험영역을 설정하고 공격과 견제를 분리한 덕택에 ​AI에​ '유저'같은 움직임을 극대화할 수 있었다.​

 

네 번째 목표인 '난이도 구현'은 '별도의 데이터 관리'를 통해 해결했다. 난이도 구현을 위해서는 51개의 전직에 대해 각각 3단계로 나뉜 스킬을 구성해야 했다. 무려 153개. 난이도별로 AI를 분리하는 건 불가능에 가깝다고 말할 수 있을 정도로 힘든 작업이다. 

 

 AI로직과 AI데이터를 별도로 관리하는 방법으로 난이도 문제를 해결했다. 

  

그래서 153개의 난이도를 만드는 형태가 아니라 AI로직은 한 벌로 둔 채 AI데이터를 별도로 관리하는 방법을 도입했다. 각 난이도별 AI데이터에는 정확도 수치만을 다르게 입력했다. AI로직에서는 정확도 데이터에 따라 콤보를 성공, 실패하는 모습을 보여준다. 낮은 난도에서는 더 빈번히 실패하며 난이도가 조절되는 방식이다. 

 

이렇듯 '시즈키의 도장'에서 볼 수 있는 AI는 비교적 간단한 방법으로 만들어졌다. 그러면서도 진짜 '유저'같은 모습을 보여준다. 이 강연에서 소개한 AI 제작 방법은 어느 프로젝트에서나 적용할 수 있는 효율적인 방법이라고 생각한다. 다른 게임에서도 이 방법을 통해 유저들에게 유저같은 AI를 보여줄 수 있을 것이라 생각한다. 

 

 빨간색(왼쪽)이 플레이어, 파란색(오른쪽)이 AI다.

전체 목록