안녕하세요.
저는 드래곤플라이에서 ‘카르마2’ 개발을 맡고 있는 K2팀의 개발팀장
김상화입니다. 저는 ‘카르마2’의 게임디자인을 담당하고 있습니다. 앞으로 8주에
걸쳐 ‘카르마2’를 개발하면서 재미있었던 에피소드들을 소개해드릴까
합니다. 예전 일들을 기억에 의존해서 작성해야 하는 부분이 있어 약간은 과장되거나 사실과 아주 매우 약간(?) 다를 수 있으니 관계자 분들은 많은 양해 부탁 드리며, ‘카르마2’ 개발일기를 시작하겠습니다. |
겨울바람이 수그러들고 어느덧 코끝으로 따뜻한 바람이 느껴지는 3월의 어느 날이었습니다. 이 날 우리는 총알이 몸에 맞았을 때, 체력이 깎이는 지에 대한 테스트를 실시하기로 했습니다. 당시 ‘카르마2’는 개발 초기 단계였기 때문에 ‘스페셜포스(이하 스포)’에 ‘카르마2’의 블루사이드 엔진(지금은 ‘FAME tech 1’ 엔진이라고 부름)을 붙여 테스트에 임하기로 했죠. ‘카르마2’의 맵 역시 개발되지 않은 상태여서 ‘스포’ 맵 중 한 곳에서 테스트를 실시하기로 했습니다.
긴상 : 자주 보던 맵인데도 보통 때 ‘스포’에서 보던 당시 와는 느낌이 다르네요.
포오렉 : 아.. 이건 FAME tech 1 엔진으로 랜더링 한거라서요. 게다가 폴리곤 수와 텍스쳐 사이즈를 강제로 늘려놔서 많이 깨져 보입니다.
긴상 : 아! 그렇군요. 아무튼 멀티로 이렇게 빨리 테스트해볼 줄은 몰랐어요. 대단하네요.
포오렉 : 그러게요. 생각보다 빨리 붙었어요.
예상보다 빨리 ‘스포’에 FAME tech 1 엔진을 적용시킬 수 있어 우리는 약간은 상기된 상태였습니다. 물론 아직은 대부분의 시스템이 구현되지 게임이라고 하기에는 이른 상태였습니다. 하지만 예상보다 빨리 테스트에 임할 수 있게 됐다는 사실은 ‘카르마2’ 개발에 있어 좋은 출발 신호였습니다. 그런데…
포오렉 : 좋아요. 그럼 총기 데미지도 실험해보죠(게임 상에 등장하는 총기가 지정한 만큼의 데미지를 주는지에 대한 테스트).
링, ㅁIrO, K, 2020 : 넵!
우선 독일군 무기인 FG42로 소련군 캐릭터를 향해 사격해 봤습니다. FG42는 2차 세계대전기간 동안 독일의 공수부대인 '팔슈름야거(Fallschirmjager)'가 사용한 총입니다. 공수부대원들이 사용할 수 있도록 특별히 제작된 총이죠. 그만큼 다양한 장점이 있는 총입니다. 그럼 실험 시작!
긴상 (쏜 사람): 맞은 것 같은데요. HP는 어때요?
ㅁIrO (맞은 사람): 예? 그대로인데요.
긴상 : 엥? 그럼 다시 한번 쏴 볼게요.
긴상 : 이번엔 제대로 맞은 것 같아요. HP가 줄어드나요?
ㅁIrO : 그대로예요. -_-
긴상 : 우잉? 진짜요??
긴상 : 그럼 가까이 좀 와보세요.
ㅁIrO : 네.
우리는 실험용 몰모트 캐릭터(ㅁIrO)와 총을 쏜 캐릭터(긴상) 간 거리가 멀어 총알이 빗나갔을 거라고 판단, 몰모트 캐릭터(ㅁIrO)와 총을 쏜 캐릭터(긴상)를 바짝 붙였습니다. (절대로) 빗나갈 수 없는 거리죠. 일부러 못 맞추기도 힘든 상황. 화면에 꽉 찬 몰모트 캐릭터(ㅁIrO)를 향해 다시 한 번 총알을 발사해 봤습니다.
긴상 : 자~ 갑니다
따다당~
긴상 : 어때요?
ㅁIrO : 헉! 체력이 안 닳아요!
메인 프로그래머 포오렉의 표정은 당황 그 자체였습니다.
긴상 : 왜 안되는거예요??
포오렉 : 그그…그러게요. 흐음…
우리는 곧장 원인에 대한 가설수립에 나섰습니다.
첫 번째 가설 - 충돌박스의 문제?
보통 적에게 총알을 맞추는 행위를 판정하는 기준은 여럿 있는데 그 중 하나가 바로 충돌박스 체크 입니다. 우선 게임에 등장하는 모든 캐릭터에 플레이어 눈에는 보이지 않는 박스를 씌워둡니다. 그리고 그 박스에 총알이 맞았나 않안맞았나는 체크하는 것이지요.
쉽게 말해 사격장에 가보면 총알에 잘 뚫리는 표적을(종이 같은) 세워두고 총을 쏩니다. 이 이유는 총알이 점수판 중에 어느 부분을 뚫고 갔는지 판단하기 위해서죠. 만약 표적이 뚫리지 않는다면 총알이 어디에 맞았는지 판단할 수 없으니 말이죠.
충돌박스도 마찬가지 역할을 합니다. 그런데 캐릭터에 충돌박스를 구현 방식은 약간의 문제를 발생 시킬 수 있습니다. 바로 총알이 캐릭터를 뚫고 지나가는 현상입니다. 즉, 분명 총알이 캐릭터를 맞췄는데 공교롭게도 그 총알이 충돌박스에는 닿지 않고, 캐릭터에게만 닿은 것이죠. 캐릭터가 총알을 맞았는가 않맞았는가는 전적으로 충돌박스에서 판단합니다. 따라서 총알이 분명 캐릭터를 맞췄지만 충돌박스에 닿지 않았기 때문에 컴퓨터는 캐릭터가 총알에 맞지 않은 것으로 판단해 버리는 것입니다.
하지만 현재의 경우는 몰모트 캐릭터(ㅁIrO) 코앞에서 총을 쐈기 때문에 위와 같은 현상이 일어날 경우는 없습니다. 상상해 보세요. 흔히 영화 자살장면에 나오는 권총을 머리에 대고 있는 장면을… 과연 이 경우 총알이 머리에 맞지 않을 확률은 얼마나 될까요? -_-?
두 번째 가설 - 패킷의 문제?
우리가 흔히 사용하는 네트워크 환경에선 보통 ‘패킷’이라는 것을 사용합니다. ‘패킷’은 네트워크를 통해 데이터를 전송하기 쉽도록 잘게 자른 데이터의 전송단위입니다. 즉, 데이터를 전송하기 쉽도록 잘게 나누어 놓은 것이지요.
패킷의 구조는 대략 아래와 같습니다.
여기에서 패킷 안의 데이터에 문제가 있을 수 있습니다. 예를 들어, 0번 플레이어가 1번 플레이어에게 총을 쏴서 맞힌 경우 그 데미지양을 패킷에 실어 1번 캐릭터에게 전송, 1번 캐릭터의 체력을 깎게 합니다. 그런데 이 패킷이 엉뚱하게도 2번 캐릭터에게 전송되는 경우가 발생하기도 합니다. 즉, 0번 캐릭터가 분명 1번 캐릭터를 쏴서 맞췄는데, 다른 장소에 있는 2번 플레이어가 피해를 입게 되는 것이죠.
하지만 이 부분은 몇 일전에 수정하고 테스트를 통해 정상적인 작동을 확인했기 때문에 문제의 원인일 수는 없었습니다.
세 번째 가설 - 캐릭터가 따로 논다?
플레이어의 눈에 보여지는 캐릭터의 모션과 컴퓨터가 처리한 캐릭터의 모션이 서로 다를 수 있습니다. 예를 들어 플레이어의 눈에는 캐릭터가 앉아 있는데, 실제 컴퓨터가 처리한 캐릭터 모션은 서 있는 상태일 수 있습니다.
링 : 하지만 세 번째 가설은 제가 충분히 체크를 한 것이고, 분명히 이전 테스트에선 캐릭터의 HP가 닳았습니다.
포오렉 : 뭐라고요?!!!!!!!
긴상 : 아니 그럼 이게 잘 되던 게 갑자기 안된다는 거예요?
링 : 넹. 그런 것 같은데요?
K : 헉 -_-;
2020 : 학 -_-;
긴상 : 혹 -_-;
ㅁIrO : 힉 -_-;
갑자기 머리 속이 아득해지는 느낌이었습니다. 시적으로 표현하자면 마치.. 음.. 안드로메다를 관광하는 느낌이랄까요?
포오렉, 링, ㅁIrO, K, 2020 : 설마 바퀴벌래 버그?!
바퀴벌레 버그.. 이 버그는 개발자들에게 있어 최대의 적이자, 최악의 상대인 버그입니다.
재현해내기도 힘들고(발견하기도 힘들고) 그냥 건너뛰자니(같이 살자니) 찝찝한 그런 바퀴벌레 같은 버그! 개인적으로 세상에서 가장 싫은 생물이 바로 바퀴벌레(신께선 왜 바퀴벌래를 만드셨는지 의문입니다)!
바퀴벌래 버그와 맞닥뜨린 기분을 설명하면 다음과 같습니다.
지하철 들어오는
소리 듣고 후다닥 내려가서 겨우겨우 탔는데 약냉방차인 것보다 더 짜증나고,
월드콘 뜯다가 아래 플라스틱 손잡이 윗부분이 뚝하고 떨어져 나가는
것보다 더 화가 나고, 비싼 밥 먹다가 잠깐 딴 데 본 사이에 파리가
숟가락에 앉아 손을 비비고 있는 것보다 더 찜찜한… 그것이 바로 바퀴벌레
버그와 조우한 기분입니다. 긴상
: 그렇군요. 바퀴벌래 버그라면.. 상당히 찾기가 어려울
듯 하네요. OTL 포오렉
: 그렇게요. 재현해낼 수 있어야 할 텐데.. 우리는 완전히
미궁에 빠진 느낌이었습니다. 여러 가지 가설들이 계속 나왔습니다.
하지만 이전 테스트에선 정상적으로 작동하다가 이번 테스트에서만 안될
이유는 없었습니다. |
그렇다면 FAME tech 1 엔진을 ‘스포’에 적용하는 과정에서 오류가 발생했을 확률이 가장 컸습니다.
좋은 출발이라고 ‘희희낙락’하던 것도 잠시… 다들 걱정스러운 표정들입니다. 뭔가 곰곰이 생각하시는 분도 계시고, HP가 닳지 않는 몰모트 캐릭터를 계속 쏴보고 계시는 분도 계시고, 골똘한 표정으로 담배만 뻐끔뻐끔 피는 분도 계시고… 분위기가 좋지 않습니다.
그 런 데 바 로 그 때!
정적을 깨며 고함치는 2020군! |
헉… (-_-;;;)
잠깐의 정적이 흘렀습니다. 머리에 갖가지 생각이 떠 올랐습니다. 그리고 약 3초 후, 상황이 파악된 우리는 한참 동안 배꼽을 잡고 웃었습니다. 배가 아프고 눈물이 나올 정도였습니다. 그리고 찾아온 안도감…
사건의 전말은 이러했습니다.
독일군 무기를 든 소련군(총을 쏜 캐릭터)이 소련군인 몰모트 캐릭터(총을 맞을 캐릭터)를 쐈으니 당연히 데미지를 입지 않았던 것입니다.
물론 이전 라운드에선 독일군 캐릭터가 소련군을 쐈었습니다.
이날 테스트에선 닉네임이 머리 위에 표시되지 않았고, 또 3인칭 시점도 구현되어 있지 않았기 때문에 총을 쏜 캐릭터가 독일군인지, 소련군인지 쉽게 구별할 수 없었기에 발생한 사건이었습니다. 아마 앞으로 다시는 일어나지 않을, 정말 웃긴 사건으로 기억에 남아 있습니다.
- 3화 '오해와 진실'편 끝 -
다음 4회는 개발자의 하루 중 생겨 난 여러 가지 에피소드를 전달해 드릴 예정입니다. 다음 회도 많은 관심 부탁 드립니다. ^^ |
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|