플레이어 여러분, 안녕하세요. 발로란트 게임 체계 팀에서 소프트웨어 엔지니어를 맡은 케빈 리입니다. 저희 팀은 이동, 전투, 키 입력 등 발로란트의 게임플레이를 지탱하는 핵심 체계의 개발을 담당하고 있습니다. 이번 글에서는 일인칭 슈팅 게임의 핵심 체계인 타격 판정에 대해 말씀드리고자 합니다.


발로란트 같은 게임에서 타격 판정은 극도로 중요합니다. 헤드샷 하나만으로 승패가 갈릴 수 있기 때문이죠. 개발자로서 저희의 목표는 플레이어가 총기를 발사했을 때 사격 결과가 명확하고, 정확하다고 느껴지고, 무엇보다도 실제로 정확하도록 하는 것입니다.


가끔 타격 판정에 문제가 있어 보이는 영상을 게시판 글에서 보거나 플레이어가 보낸 메시지를 통해 받곤 합니다. 제보된 내용은 모두 심각하게 다루며 영상을 프레임별로 살펴보면서 체계가 예상대로 작동하는지 검증합니다.


그렇기는 하지만, 발로란트에서의 타격 판정은 현재 양호한 상태라고 생각합니다. 물론 매우 특이한 상황에서 발생하는 버그는 남아있을 수 있으며 이러한 버그는 항상 심각하게 여깁니다. 모든 체계의 품질과 명확성을 개선하기 위한 노력은 멈추지 않습니다.


정확성 대비 명확성


클로즈 베타 0.50 패치 기간에는 타격 판정 문제와 관련된 제보가 급증했습니다. 제보된 내용과 영상을 살펴보고 장기간의 내부 테스트를 진행한 결과 타격 판정과 관련해 특이 상황에서 발생하는 버그를 몇 개 발견하기는 했지만, 제보 건수의 급증을 야기할 만큼 심각한 문제는 없었습니다. 더 자세히 살펴보니 대다수의 영상은 정확성이 아니라 명확성의 문제와 관련이 있음을 발견했습니다. 사격이 제대로 처리되고 있지만 시각적 정보로 인해 오해의 소지가 생긴 경우가 많았습니다. 이는 정확성과 명확성을 확실하게 구분할 필요가 있음을 보여줍니다.


두 개념 모두 사격 시 ‘느낌’에 큰 영향을 끼치지만...


  • 정확성은 사격 결과가 잘못된 경우(예를 들어 총알이 머리에 맞았는데 몸통 판정이 적용되거나 적 플레이어가 클라이언트와 서버에서 다르게 표시되는 경우)에 적용되는 개념입니다.
  • 명확성은 사격이 묘사되는 방식 때문에 알아보기 어려운 경우(예를 들어 총알이 어깨에 맞았는데 시각적 정보 때문에 머리에 맞은 것처럼 보이는 경우)에 적용되는 개념입니다.
  • 정확성 관련 버그는 명확성 관련 버그보다 훨씬 심각한 문제입니다.

오늘 글이 타격 판정 체계를 조금이나마 이해하는 데 도움이 되어 게임플레이를 돌아보실 때 사격과 관련해 화면에서 어떤 상황이 벌어지고 있는지 파악할 수 있게 되는 계기가 되기를 바랍니다. 우선 타격 판정 체계의 작동 원리를 전체적으로 소개한 뒤 발사 키를 누른 순간부터 헤드샷이 표시되는 순간까지의 과정이 어떻게 되는지 설명해드리고자 합니다.


기술적인 부분을 심층적으로 살펴보고 싶으신 분은발로란트의 넷코드를 다룬 라이엇 게임즈 기술 블로그 글(영문 링크)을 확인해보시기 바랍니다.


또한 타격 판정 ‘문제’로 흔히 오인되는 사례를 살펴보면서 각각 어떻게 된 일인지 설명하고, 이러한 경우에서의 명확성을 개선하기 위해 어떤 노력을 하고 있는지 말씀드리겠습니다.


클릭에서 헤드샷까지


총기를 발사할 때 어떤 절차가 진행되는지 살펴보기 전에 우선 게임 상황에 대한 시뮬레이션이 어떻게 작동하는지 이해할 필요가 있습니다. 발로란트의 게임플레이는 두 번의 시뮬레이션을 거칩니다. 시뮬레이션의 진행을 관장하는 주체인 서버에서 한 번, 서버 측 결과를 예측해 플레이어가 체감하는 게임 응답 속도를 높이기 위해 클라이언트에서 한 번 더 이루어집니다.


게임 상황 시뮬레이션에는 모든 플레이어의 위치, 공중을 가로지르고 있는 스킬, 전장에 배치된 연막 등 게임 내 세계를 구성하는 모든 요소가 포함됩니다. 프레임마다 각 시점의 시뮬레이션 속 상황이 기록되며 게임은 이러한 기록을 활용해 해당 프레임을 화면에 렌더링합니다. 서버 쪽에서도 프레임마다 이러한 절차가 진행됩니다. (다만 서버 측에서는 화면을 출력할 필요가 없기 때문에 렌더링 단계는 생략됩니다.)


적이 모퉁이 뒤에서 튀어나왔는데 실력자답게 헤드라인을 정확히 잡고 있었기 때문에 조준점이 이미 상대의 머리에 놓여 있어 바로 마우스 왼쪽 버튼을 클릭해 총기를 발사한 상황을 살펴보겠습니다. 이제 어떤 일이 일어날까요?



hit_reg_flow_kr.jpg



키를 누르는 순간 해당 입력 신호가 입력 시스템으로 전송됩니다. (이 과정은 하드웨어 및 운영체제 자체 지연 시간의 영향을 약간 받습니다.) 입력 시스템에서는 프레임마다 직전 프레임 이후 도착한 모든 입력 신호가 처리됩니다. 총기를 발사하면 ‘발사’라는 입력 신호와 함께 시뮬레이션 내에서 발사가 이루어진 프레임의 타임스탬프가 서버로 보내집니다.


여기서 주목해야 하는 부분은 게임이 입력 신호를 받는 시점 당시에 렌더링되는 화면이 타임스탬프의 기준이 된다는 점입니다. 이제 클라이언트와 서버, 두 쪽의 시뮬레이션에서 각각 사격이 어떻게 처리되는지 살펴봐야 합니다.


우선 클라이언트, 즉 플레이어의 컴퓨터 측부터 살펴보겠습니다. 사격이 이루어졌다는 정보가 서버로 전송된 직후 클라이언트에서는 사격의 총구 섬광과 탄환 궤적을 표시하기 위한 작업이 시작됩니다. 화면에 표시될 새로운 프레임이 렌더링되어야 하므로 총구 섬광과 탄환 궤적을 표시하는 작업은 아무리 일러도 발사 키 입력 후 한 프레임 뒤에 이루어집니다. 이때 사격이 처리되는 프레임과 탄환 궤적이 표시되는 프레임이 다르다는 점이 핵심입니다. 사격은 사실 최소 한 프레임 전에 처리됩니다.


처리 과정이 이렇기 때문에 가끔 사격 명확성이 떨어질 수 있습니다. 이러한 불일치를 해결하기 위해 탄환을 지연시키는 방법을 사용하는 경우가 흔합니다. 하지만 탄환을 지연시키면 입력 지연 시간이 늘어납니다. 발로란트에서는 이를 최소화하고자 하므로 사용하지 않는 방법입니다. 명중 판정의 경우 서버 측 판정 결과가 클라이언트에 도착한 후에 표시됩니다. 모든 플레이어 경험의 일관성을 보장하고 클라이언트를 해킹해 사격 결과를 조작하는 부정행위를 방지하기 위해 사격 결과는 오로지 서버 권한으로만 처리됩니다.


그사이 클라이언트에서 사격이 이루어졌다는 신호가 서버에 도착합니다. 네트워크 지연 시간 때문에 탄환을 발사한 후 시간이 흐른 상태입니다. 따라서 플레이어가 본 시뮬레이션과 동일한 상황에서 사격에 대한 시뮬레이션이 이루어지도록 서버는 클라이언트로부터 전송된 타임스탬프의 시점으로 시뮬레이션을 되감은 후 명중 여부를 판정합니다. 플레이어 위치와 애니메이션까지 그 시점의 상태로 되돌려집니다. 판정이 끝나면 서버는 사격 결과를 클라이언트에 전송합니다. 이번에는 사격 결과가 헤드샷이라고 가정하고 살펴보겠습니다!


클라이언트는 서버로부터 사격 결과를 전송받은 후 알맞은 시각 효과와 음향 효과를 재생합니다. 이 경우에서는 헤드샷 시각 효과와 음향 효과가 되겠죠. 서버 측 사격 결과가 도착할 때까지 시간이 걸리기 때문에 탄환 궤적과 타격 효과가 표시되는 시점 사이에는 네트워크 왕복 시간만큼의 시차가 존재합니다. (예를 들어 신호가 서버에 도착하기까지 40밀리초가 걸리는 경우 탄환 궤적과 타격 효과 사이에 80밀리초의 시차가 생기며 여기에 약간의 처리 시간이 추가됩니다.) 지연 시간이 길어지면 실시간으로 인지할 수 있을 정도로 시차가 늘어나기도 합니다.


이러한 부분은 명확성 차원에서 개선하기 위해 적극적으로 살펴보고 있습니다.


사례 연구 1: 움직이는 상대를 명중한 경우


Case_Study_1.gif


타격 판정 관련 제보를 확인해보면 표적이 달리고 있는 경우가 많습니다. 달리는 중인 상대를 명중했을 때 시각적으로 어떤 일이 벌어지는지 자세히 살펴보도록 하겠습니다. 이 사례에서는 플레이어가 달리는 상대에게 성공적으로 헤드샷을 맞춥니다. 문제를 명확하게 보여드리기 위해 클라이언트의 초당 프레임 수는 60으로 설정되어 있습니다. 아래와 같이 탄환 궤적이 표시되기 직전의 프레임에서 조준점이 적의 머리와 정렬되는 모습을 확인할 수 있습니다.


case-study-1_frame-1.jpgcase-study-1_frame-2.jpg

하지만 탄환 궤적이 표시되는 프레임에서는 정렬되지 않은 상태입니다.


case_study_1_part_2.gif


두 번째 영상은 첫 번째와 상황이 비슷하지만 사격이 표적을 아슬아슬하게 빗나가는 모습을 보여줍니다. 영상을 프레임별로 살펴보면 첫 번째 영상과 상황이 반대라는 점을 확인할 수 있습니다. 탄환 궤적이 표시되기 전의 프레임에서는 조준점과 머리가 정렬되어 있지 않지만, 탄환 궤적이 표시되는 프레임에서는 조준점이 머리에 놓여 있습니다. 따라서 탄환 궤적이 표시된 프레임을 보고 언뜻 ‘역시 어떻게 봐도 헤드샷이네!’라는 생각을 하기 쉽습니다. 그러나 영상이나 리플레이를 검토할 때 사격이 이루어진 시점을 정확하게 짚으려면 탄환 궤적이 표시되기 전의 프레임을 살펴봐야 합니다.


case-study-1_part2_frame-1.jpgcase-study-1_part2_frame-2.jpg
case-study-1_part2_no-hit-vfx.jpg

표적을 명중한 사례로 돌아가 타격 시각 효과가 렌더링되는 프레임을 살펴보도록 하겠습니다. 네트워크 지연 시간의 영향으로 상대의 위치와 타격 시각 효과의 위치가 현저히 불일치하는 모습입니다. 이러면 사격을 가한 플레이어 입장에서는 사격 결과를 이해하기 어려울 수 있습니다. 보통 총기를 발사한 순간에 적이 어디에 있었는지가 아니라 적의 현재 위치에 집중하게 되기 때문이죠. 또한 상대가 앉거나 이동 중이면 더욱 혼란스러운 상황으로 이어질 수도 있습니다. (이러한 경우는 사례 연구 2에서 다루겠습니다.)


case-study-1_part2_frame-where-hit-vfx-rendered.jpg


이 사례는 현재의 타격 판정 체계에서 명확성이 떨어지는 경우를 보여줍니다. 이상적으로는 이와 같은 배경지식이 없어도 사격 후 상황을 파악하는 데 지장이 없어야 합니다. 개발자로서 문제를 인지하고 있으며 이러한 경우에서의 명확성을 개선하는 방법을 살펴보고 있습니다.


사례 연구 2: 상대가 앉아 타격 시각 효과 안으로 들어가는 경우


장거리 교전이 벌어진 상황입니다. 곧 후회하게 되겠지만, 마우스 왼쪽 버튼을 길게 눌러 총기를 연사하기로 합니다. 총알 하나 정도는 머리에 박히지 않을까요? 하지만 밴달로 몸통에만 3발을 명중해 117의 피해를 입히는 데 그치고 상대에게 헤드샷을 당하고 맙니다.


분노를 삼키고 분명 타격 판정에 문제가 있었을 거로 생각하며 게임이 끝난 후 영상으로 상황을 다시 확인해봅니다. 상대가 총알을 피하고자 앉기를 마구 반복하고 있는 모습이 보입니다. 놀랍게도 상대가 앉은 도중 타격 시각 효과가 정확히 머리 위에 표시되는 장면이 눈에 들어옵니다. 그런데 전투 기록에는 몸통 타격밖에 없었다고 나옵니다! 도대체 어떻게 된 영문일까요??


이러한 경우의 실제 사례가 궁금하시면 레딧에 올라온플레이어가 앉았을 때 헤드샷 판정이 적용되지 않는다는 내용의 글(영문 링크)에서 확인하실 수 있습니다.


타격 판정 문제에 관한 제보를 조사하다 보면 말씀드린 사례와 비슷한 이유로 부정확한 타격 판정이 문제의 원인처럼 보이는 경우가 가장 흔합니다. 이러한 경우에서 타격 판정은 제대로 작동하고 있습니다. 발사 버튼을 눌렀을 때 (탄퍼짐이나 움직임 오차의 영향을 제외하면) 조준했던 위치에 따라 사격이 이루어지고 서버에도 정확히 기록됩니다.


하지만 이와 같은 사례에서 시각적으로 오해의 소지가 발생할 수 있는 상황이 몇 가지 있습니다.


  1. 네트워크 지연 시간 때문에 타격 시각 효과가 늦게 표시되는 경우
  2. 타격 시각 효과가 사격이 이루어졌던 시점의 위치에 표시되는 경우
  3. 표적이 움직이고 있는 경우 (보통 앉는 경우)

Case_Study_2.gif


예를 하나 더 들어보겠습니다. 플레이어의 핑이 100이라고 가정해보죠. 적에게 어깨 타격을 명중한 상황입니다. 타격 판정 결과가 서버로부터 도착할 때까지 기다려야 하기 때문에 100밀리초 후 몸통 사격이 이루어진 위치에 타격 시각 효과가 나타나기 시작합니다. 하지만 그 100밀리초 사이에 상대가 앉기 시작해 방금 생성된 타격 시각 효과 뒤로 머리가 위치하게 됩니다. 그러면 격렬한 총격전이 벌어지는 도중 장거리 사격 시 몸통 타격 시각 효과가 헤드샷 시각 효과처럼 보여 헷갈릴 수 있습니다.


case-study-2_cursor-on-body.jpg
case-study-2_hit-VFX-on-body-correctly.jpg
case-study-2_player-crouches-into-vfx.jpg


타격 판정의 명확성 문제는 개선하기 위해 적극적으로 노력 중 입니다. 예를 들어 캐릭터의 몸에서 사격이 이루어진 부위에 타격 시각 효과를 결부시키는 방안을 살펴보는 중입니다. 그러면 지연 시간이 길어도 둘 사이의 관계가 명확하게 드러날 수 있겠죠.


현재 유혈 효과 비활성화 시 보이는 헤드샷 시각 효과와 몸통 타격 시각 효과를 비교하면 아래와 같습니다.


headshot-VFX.jpgbody-shot-VFX.jpg

예정된 명확성 개선사항


오늘 말씀드린 두 가지 사례는 현재 타격 시각 효과의 부족한 점을 보여줍니다. 진행 중인 작업으로는 타격 효과가 캐릭터의 현재 위치뿐만 아니라 사격 당한 부위에 생성되도록 하고 캐릭터가 이동하면 따라가도록 하는 변경사항이 있는데요. 변경사항이 적용되면 시각 효과가 캐릭터의 움직임을 따라가기 때문에 사례 연구 2와 같이 상대가 앉았을 때 발생할 수 있는 상황에서의 명확성을 대폭 개선할 수 있습니다.


다만 이러한 접근법에는 캐릭터가 엄폐물 뒤로 사라지면 타격 시각 효과도 함께 사라질 수 있다는 단점이 있습니다. 지연 시간이 100밀리초인 상대가 모퉁이 뒤에서 튀어나왔다 들어가기를 반복하는 경우를 생각해보겠습니다. 명중 당한 상대가 타격 판정 결과가 서버로부터 도착하기 전에 바로 모퉁이 뒤로 들어가 버리면 타격 시각 효과가 생성되었을 때 플레이어가 못 보게 되는 상황이 발생합니다.


문제를 완화하기 위해 시각 효과에 여러 파티클을 추가해 일부는 캐릭터를 따라가고 일부는 타격 위치에 즉시 생성되도록 하는 방안도 고려해봤습니다. 하지만 만약 클라이언트와 서버의 시뮬레이션에서 사격 결과가 일치하지 않으면 혼선이 빚어질 수 있습니다. 사격 결과를 파악하는 데 어려움이 없도록 시각 효과가 무엇을 나타내는지가 명확히 드러나야 합니다.


이러한 작업뿐만 아니라 명확성을 위한 다른 개선사항도 준비하고 있으며 조만간 이후 패치에서 명확성 관련 업데이트를 적용하고자 합니다.


계속해서 영상 제보 부탁드립니다


이번 글이 발로란트 타격 판정 체계의 작동 원리와 사격이 특정 결과로 이어진 이유를 더욱 자세히 이해하는 데 도움이 되셨기를 바랍니다. 언제든지 타격 판정에 문제가 있는 듯하면 영상으로 제보 부탁드립니다. 보내주시는 영상은 전부 확인하기 위해 최선을 다합니다.


제보된 영상에 문제가 없는 것으로 드러나더라도 이러한 작업은 타격 판정 정확성에 실제로 문제가 생겼을 때 원인을 더욱 신속하게 파악하는 데 도움이 됩니다. (저는 레딧 인기 글에서 “타격 판정”이라는 단어를 볼 때마다 심장이 두근거립니다.)


여기에서 레딧에 올라온 타격 판정 정확성 버그의 예시를 확인하실 수 있습니다.