■ '디토랜드로 게임 만들기' 기획기사 바로가기
[프리뷰] 내가 만드는 가상월드 '디토랜드'
[실전①] 뼈대를 알아야 살을 붙인다
└[실전②] 템플릿만 개조해도 반은 OK
└[실전③] 만들긴 만들었는데 QA... QA가 필요하다(예정)

지난 1편에서는, 그럴싸한 맵을 만들고 총과 각종 오브젝트를 넣었습니다. 메타버스나 샌드박스 게임개발의 매력이라고 한다면, 자신이 무언가 만들지 않아도 남이 만든 걸 갖고 와서 얼기설기 엮어도 그럴싸한 모양이 나온다는 점일 겁니다. 스타일이 튀거나 그런 일도 없고, 어느 정도 틀 안에서 자유롭게 갖춰진 게 장점이니까요. 심지어 한 번도 만져본 적 없는 것도 짜맞추면 그럴싸한 모양은 만들 수 있죠. 이런 장점을 디토랜드에서도 확인해볼 수 있었습니다.

다만 그걸로 끝은 아닙니다. 모양새는 갖춰졌다고 해도, 내부에서 자연스레 연결되나 확인을 해봐야 하니까요. 예를 들자면 TPS나 FPS에 쓰려고 총을 가져왔는데, 아마 총이 불발되는 경험을 몇 번 겪어보셨을 겁니다. 분명히 애셋 평가도 좋아서 믿고 받았더니, 이 게임에서만 안 되는 게 뭔가 통수를 치는 듯한 그런 느낌이 들죠. 기계는 거짓말을 하지 않으니 어딘가 부족한 건 사실이겠습니다만, 그걸 찾는 것도 일입니다. 지금 제가 겪고 있는 게 딱 그 상황이기 때문이죠.

기본적인 게임 개발이었다면 무에서 유를 창조해나가는 그 과정 자체를 조명했겠지만, 메타버스나 샌드박스 게임 개발은 있는 걸 잘 개조해서 써먹는 것에 강점이 있는 분야입니다. 그래서 해법도 그에 맞춰서 진행했습니다. 기본 템플릿을 일단 뜯어보고 변형시키면서 알아가는, 그런 방법이죠.

▲ 기껏 야심차게 넣었는데...총알이 안 나간다?



■ 모를 땐 일단 템플릿을 재조립해보자

▲ 디토랜드에서 기본 제공되는 TPS 템플릿

이번에 만들고 있는 게임이 TPS라 디토랜드의 템플릿 중에서 TPS를 선택, 새로 프로젝트를 만들었습니다. 처음에 템플릿을 쭉 훑어보면 이미 완성된 게임이라서 더 무얼 건드려야 할지 망설여질 겁니다. 자칫 잘못 건드렸다가 게임이 아예 구동이 안 될 것 같으니까요. 작업 하나 할 때마다 Ctrl+Z과 Ctrl+Y, 뒤로 가기와 되돌리기를 반복하면서 조심조심 나아가면 되긴 하지만 그것도 성가신 작업이죠.

게임 개발 단계에서 맵에 보이는 대다수의 오브젝트 관련 정보는 월드트리의 워크스페이스란에 있습니다. 로블록스였다면 인바이런먼트에 지형편집기 관련 정보가 있겠지만, 디토랜드엔 아직 지원하지 않으니 인바이런먼트는 볼 일이 없고 나머지 다른 폴더나 그룹, 토이들을 하나하나 훑어봐야 하죠.

기존에 있는 템플릿을 편집해서 자기만의 게임을 만들 때 가장 쉬운 방법은 지형지물을 날려버리고 새로 지형지물을 까는 방법입니다. 앞서 언급했던 것처럼 디토랜드는 지형편집기로 지형을 만드는 게 아니라 토이를 일일이 깔아서 지형을 만드는 방식이다보니, 그 토이들을 찾아서 지운 뒤 다른 걸로 대체하면 얼마든지 지형을 바꿀 수 있죠. 자기가 직접 만들기 귀찮다면 옆에 있는 툴박스에서 다른 사람이 만든 것들을 갖고 와도 되고요.

▲ 사방에 있던 벽들은 워크스페이스에서 찾아서 지우고, 다른 걸 넣었습니다

그런데 이렇게 남이 만든 걸 갖고 오는 것만으로는 한계가 있습니다. 아까 총기를 예로 들었지만, 그거 말고도 총기나 아이템 리스폰도 비슷한 문제가 발생하죠. 분명 리스폰되는 아이템이라고 해서 들고왔는데 막상 깔아보니까 안 되는 일이 벌어지니까요.

사실 리스폰 개념은 그냥 아이템을 맵에다가 깔아둔 걸 불러오는 게 아니라, 그 정보를 엔진 내에 원형으로 보관해두고 그 원본을 계속 복사해서 불러오는 방식입니다. 디토랜드에서 이렇게 하려면 워크스페이스가 아닌 토이박스에 넣어야 하죠. 템플릿에서 예제로 나온 스크립트를 보면 토이박스에서 GunList 폴더에 있는 아이템들을 읽고 그 중 하나를 랜덤하게 스폰하는 식입니다. 플레이어가 가져가면 몇 초 지나서 다시 랜덤하게 하나를 스폰하게끔 되어있죠.

이를 편집해보면 지정된 위치에 특정 무기만 나오도록 설정하는 스크립트를 짤 수는 있을 겁니다. 전 LUA 언어로 확실하게 그 스크립트를 짤 자신이 없어서 시도는 아직 안 했지만요. 대신 이제 월드트리에 워크스페이스에 있던 무기들을 토이박스-GunList에 넣어두면 랜덤 스폰풀에 저장된다는 건 알았습니다. 그렇게 한 뒤에 테스트를 해보면, 실제로 다운받아둔 무기들이 정상적으로 스폰이 되는 걸 확인할 수 있죠.

▲ 별다른 설정 없이 무기만 놓으면

▲ 그냥 사라집니다

▲ 스크립트를 까보면 뭐라 써있는지 몰라도, 리스폰을 할 때 GunList에 있는 게 필요한 건 보이네요

▲ 템플릿 기준으로 토이박스에 GunList 폴더가 만들어져있는데, 거기에 넣으면 됩니다



■ 비교분석하면서 부족한 걸 찾기

▲ 스크립트 편집하다가 오류나는 작업쯤은 뭐 다반사죠. 오히려 안 뜨고 실행이 안 되면 더 불안합니다

현재는 디토랜드를 배워가는 단계라 기본 템플릿을 기반으로 작업을 하고 있긴 합니다. 그렇지만 기본 템플릿으로 무언가 하려면 이것저것 훑어보고 뜯어고치면서 오류를 분석하는 작업들을 거쳐야 하죠. 그래서 좀 익숙해지고 나면 새로 만드는 게 나을 수 있습니다. 아니면 새로 다시 써보면서 어디가 부족한지 체크해나가는 과정을 밟아가는 거죠.

예를 들자면 원래 만들고자 한 것이 4VS4 팀플레이 TPS인데, 샘플 템플릿은 그런 팀 구분 없이 제한 시간과 K/D 순위만 나열하는 기능이 있습니다. 해당 기능은 워크스페이스 내에 있는 시스템 폴더에 있죠. 스크립트를 뜯어서 보면 서버 스크립트-클라이언트 스크립트로 구분이 되어있는데, 훑어보면 주요 내용은 서버에서 처리하고 클라이언트에서는 UI 정도만 관여한다는 걸 알 수 있습니다. 물론 이건 게임에 조금 깊이 관심이 있다고 하면 기본적으로 알고 있을 내용이긴 하지만, 스크립트로 확인해보는 건 의미가 있죠. 어쨌든 그렇게 짜여져있는 건 알았으니, 그걸 어떻게 짜야 할지 궁리하는 다음 단계로 갈 수 있으니까요.

디토랜드가 편리한 점이라면, 서버와 클라이언트 스크립트가 미리 분류가 되어있어서 따로 스크립트를 까보지 않아도 구조를 파악할 수 있다는 점입니다. 만들 때도 서버 스크립트와 클라이언트 스크립트를 구분해서 만들 수 있죠.

▲ 구조가 복잡하긴 한데, 요는 서버 스크립트에 플레이어 접속 관련 내용이 들어있다는 뜻이죠

▲ 거기 어딘가에 이 Team 함수를 쓰면 될 것 같은데...어디다 넣어야 할까요

물론 서버 스크립트에서 페이즈 단위로 나누어놓고, 함수와 그 조건들을 하나하나 충족해나갈 때마다 다음 단계로 넘어가게끔 설계하는 건 코드 문외한에게는 쉬운 일이 아닙니다. 더군다나 클라이언트 스크립트로 UI도 이미 기존 것과 연동이 되어있기 때문에 이를 어디서부터 수정해나가야할지 짚어가는 건 좀 힘든 작업입니다.

그럴 때는 이를 하나하나 다시 재조립하고, 분석하면서 부족한 점을 메워가는 것이 공부하는 방법일 겁니다. 친절하게 주석이 달려있긴 하지만, 주석을 그냥 읽어보는 것과 실제로 작동하나 안 하나 확인하는 건 좀 다르기 때문이죠. 템플릿의 페이즈 단위를 보고 직접 테스트해본 뒤, 자신이 만든 걸 확인해보면 무엇이 부족했나 확인할 수도 있죠.

예를 들면 템플릿은 게임 페이즈가 호스트가 게임 시작-다른 플레이어 대기-인원이 모인 뒤 로비에서 대기-게임 시작-게임 종료-로비 단계로 다시 회귀 이런 식으로 구성이 되어있습니다. 근데 보통 게임을 처음 만들 때는 그런 게임 페이즈 구분이 안 되어있죠. 점수나 타이머 등도 받아는 뒀는데, 스크립트가 활성화될 조건을 갖추지 않아서 제대로 작동 안 할 수도 있고요. API 레퍼런스를 보면 좀 더 쉽게 확인할 수 있으니, API 레퍼런스도 체크해보길 권합니다.



■ "이런 문제가 있었어?" 중간중간 테스트는 필수다


일일이 다 만들기엔 시간이 부족하고, 결론적으로 왜 새로 만든 템플릿에서 총이 왜 안 나가는지 그 문제를 해결 못한 상태라 일단 템플릿을 응용해서 게임을 만들었습니다. 앞서 말한 것처럼 무기 종류를 추가하고, 맵 디자인을 바꿔버린 뒤 텔레포트 패드를 깔아서 동선을 바꿨죠. 상용 엔진에서는 허공에 떨어진다고 해서 죽지 않으니, 떨어지면 죽는 판정을 새로 넣어야하나 고민했는데 그건 구현이 되어있어서 그 단계는 패스했습니다.

일단 어느 정도 모양새는 갖춰지긴 했는데, 그게 제대로 작동하는지 무조건 하나하나 다 테스트를 해봐야 합니다. 앞서 말했듯이 총알이 안 나가기도 하는 등, 뭔가 빠지는 구석이 있으니까요. 역시나 텔레포트 패드가 정상 작동을 안 해서 이리저리 훑어봤더니, 지면에 딱 닿게 하면 플레이어 캐릭터를 인식을 못하더군요. 그래서 살짝 지면에서 띄워서 배치하는 식으로 개선을 했습니다.

▲ 안 되면 일단 이리저리 움직여보고 테스트해봅시다

그렇게 솔로 테스트로 해결할 수 있는 것도 있지만, 다 같이 해봐야만 알 수 있는 것들도 분명 있습니다. 다른 플레이어가 접속했을 때 얼마나 기다려야 하는지, 얼마나 모여야지 게임이 넘어가는지 등등을 체크해볼 수 있죠. 스크립트나 파라미터에 다 나와있는 내용이긴 한데, 그게 제대로 되나 안 되나는 확인을 해보긴 해야 하니까요.

맵 밸런스나 실제 게임플레이 동선 역시도, 직접 멀티플레이 테스트를 해보지 않으면 한계가 있긴 합니다. 자기가 만들어서 다 알 때와, 전혀 모르는 상태에서 플레이하는 건 정말 천지차이로 다르다는 걸 새삼 느낄 수 있죠. 무기 밸런스나 세팅도 그냥 혼자 테스트할 때는 별로 체감이 안 되지만, 여럿이 함께 테스트해보면 어떻게 고쳐야겠다고 감이 오기도 하고요.

▲ 우클릭해야 화면이 전환되는데 스나이퍼라이플은 무조건 줌이 적용될 줄이야...

그렇게 하나하나 수치를 바꿔가면서 저장하고, 다시 퍼블리시해서 데이터를 덧씌우는 식으로 패치를 해나가면 게임은 점차 완성에 가까워집니다. 예전 게 좀 더 좋았다고 하면 대시보드에 지난 버전이 기록되어있고, 그걸로 회귀할 수 있으니 롤백 부담도 덜하죠. 다만 현재는 다른 사람과 플레이하면 개발 완료처럼 인식이 되서 수정이 어렵기 때문에, 로컬 세이브 버전을 잘 관리해두는 요령이 필요합니다. 기존에 개발한 걸 계속 퍼블리시하면서 바꾸기보다는, 로컬본을 불러와서 개선한 걸 새로 퍼블리시하는 게 좀 더 편하기 때문이죠.

어쨌거나 템플릿을 개조해서 그럴싸한 게임은 만들 수 있다는 건 확인했으니, 좀 더 시간이 지나면 이를 토대로 새롭게 다듬은 무언가를 만들어나가는 과정까지 나아갈 수 있을 듯합니다. 이왕 만든 것들을 좀 더 다듬어가는 것도 필요할 테고요. 일단 지금까지는 딱 한 번 테스트를 해본 상태인데, 그 다음엔 테스트를 더 하고 어떤 식으로 고쳐나갈지 짚어가고자 합니다.