안녕하세요 여러분, AL입니다. Mortumus의 첫 번째 비하인드 스토리에 오신 걸 환영합니다.
Fin이 서버 광산에 파묻혀서 데이터베이스, 구독 시스템, 그리고 세계를 살아 움직이게 만드는 온갖 무시무시한 분산 시스템 마법과 씨름하고 있는 동안, 저는 반대편에서 모든 검격, 발소리, 횃불 깜빡임, 그리고 갑옷 하나하나가 여러분 화면에서 제대로 보이고 느껴지도록 만드는 일을 하고 있습니다.
다크 판타지 MMO를 만드는 건 에셋 스토어에서 드래그 앤 드롭으로 조립할 수 있는 그런 게 아닙니다. 우리가 추구하는 거칠고 올드스쿨한 느낌(전투의 무게감, 갑옷의 삐걱거림, 지평선에서 다른 플레이어를 발견했을 때의 공포)은 밑바닥 도구들이 그걸 위해 특별히 만들어졌을 때만 나옵니다. 그래서 오늘은 클라이언트 쪽에서 만들어온 커스텀 Unity 시스템 몇 가지의 커튼을 열어보려 합니다. 아무도 보지 못할 시스템이지만, 모든 사람이 느낄 시스템들입니다.
시작하겠습니다.
비주얼, 루트, 그리고 PvP 프라이버시
MMO 플레이어에 대한 진리가 하나 있다면 이겁니다: 우리는 장비를 사랑합니다. 그리고 Mortumus 같은 풀루트 PvP 게임에서 장비는 단순한 도파민이 아니라 정보입니다. 누군가 뭘 입고 있는지가 그 사람이 당신에게 뭘 할 수 있는지 알려줍니다.
비밀은 지키고 안전하게: Equipment Visualizer
초기에 우리는 많은 MMO가 조용히 무시하는 문제를 발견했습니다. 클라이언트가 시야 내 모든 플레이어의 장비 아이템 ID를 정확히 안다면, 의지가 있는 치터가 메모리에서 그걸 긁어내서 당신을 죽이기로 결정하기 전에 정확한 스탯을 알 수 있다는 겁니다.
그래서 우리 Equipment Visualizer는 약간 편집증적인 동작을 합니다. 자기 캐릭터에 대해서는 전체 장비 서비스에서 읽어옵니다. 장비에 대한 모든 걸 볼 수 있죠. 하지만 다른 플레이어에 대해서는 서버가 공개하는 간소화된 "visuals" 데이터만 읽습니다. 검은 보이지만, 스탯 시트는 안 보입니다. 다른 사람의 아이템 ID는 Fin의 서버를 절대 떠나지 않습니다.
작은 일입니다. 하지만 메모리 스크래핑 치트를 훨씬 덜 유용하게 만듭니다. 좋은 거래죠.
애니메이션 스택
스킬 기반 전투는 애니메이션에서 살고 죽습니다. 와인드업이 읽히지 않으면 반응할 수 없습니다. 타격감이 없으면 전투가 가볍게 느껴집니다. 죽음이 그냥 모델이... 꺼지는 것처럼 보이면 분위기의 절반을 잃습니다.
Player Animation Coordinator
우리도 대부분의 사람들처럼 시작했습니다. 모든 걸 관리하려는 거대한 애니메이션 컨트롤러 클래스 하나. 이동, 스펠, 죽음, 피격, 대기 모션 전부 같은 파일에. 2주쯤 지나니 엉망이 됐습니다.
그래서 분리했습니다. 지금 Player Animation Coordinator는 작고 특화된 모듈 스택을 띄우는 아주 작은 진입점입니다: 이동, 회전, 공격, 스펠, 피격 반응, 죽음, 대기 모션. 각 모듈은 하나의 일만 합니다. 각 모듈은 독립적으로 읽을 수 있습니다. 버그 추적이 몇 시간이 아니라 몇 분이면 됩니다.
저에게는 더 깔끔한 코드. 여러분에게는 더 빡빡한 전투.
전투 반응성: Attack Animator & Spell Animator
클래식한 MMO 문제입니다: 서버 권한 전투만이 치팅을 막는 유일한 방법이지만, 매 시전마다 서버 확인을 기다리면 끈적끈적하게 느껴집니다.
우리 Spell Animator는 살짝 속이지만, 정직하게 속입니다. 스펠 키를 누르면 시전 애니메이션이 즉시 재생됩니다. 로컬 예측이라 즉각적으로 느껴집니다. 그 후 Fin의 서버가 시전이 실제로 합법적이었는지 검증합니다(cooldown 완료, mana 충분, 대상 유효 등). 승인하면 아무것도 바뀌지 않습니다. 거부하면 깔끔하게 빠져나옵니다.
Attack Animator는 근접 공격에서 같은 춤을 추고, 서버가 지정한 무기 공격 속도에 맞춰 스윙 속도를 조절하기까지 합니다. 눈에는 반응 좋은 전투가 보입니다. 서버에는 속일 수 없는 세계가 보입니다.
"느낌 좋음"과 "공정한 플레이" 사이의 그 달콤한 지점, 이 게임 전체가 사는 곳이 바로 거기입니다.
왕국의 소리
오디오는 분위기의 50%인데 사람들은 얼마나 많은 작업이 필요한지 항상 과소평가합니다.
분위기 만들기: Audio Manager & Music Region System
기존 게임들은 보이지 않는 선을 넘을 때 음악을 그냥 뚝 잘라서 바꾸는 경향이 있습니다. 어색하죠. 우리는 3D 폴리곤 존으로 합니다. Music Region System으로 세계에 임의 형태의 영역을 칠할 수 있습니다(저주받은 숲, 저주받은 예배당, 보스로 향하는 길). 들어가고 나올 때 Audio Manager가 사운드트랙을 부드럽게 크로스페이드합니다. 끊김 없음. 경계를 살짝 밟았다고 같은 트랙이 처음부터 다시 시작되는 일 없음.
그리고 이 모든 것이 믹서 그룹 라우팅을 사용하는 풀링된 오디오 소스로 돌아가기 때문에 프레임 예산에서 거의 비용이 들지 않습니다.
Character Audio Manager
Mortumus의 모든 발소리는 캐릭터 애니메이션과 발밑 표면에 연결되어 있습니다. 돌은 돌 소리가 나고, 진흙은 진흙 소리가 납니다. 스펠 사운드는 능력에, 무기 스윙은 무기에 연결됩니다. Character Audio Manager는 애니메이션 이벤트와 Audio Manager 사이에 위치해서 게임플레이 코드를 건드리지 않고도 종족/클래스별로 새 SFX 팩을 교체할 수 있게 해줍니다.
작은 것들. 많은 것들. 쌓입니다.
물가에서
모든 다크 판타지 세계에는 물이 있습니다. 늪, 강, 침수된 폐허, 저주받은 곶 끝의 바다. 그리고 물은 쉽게 가짜처럼 보이는 것들 중 하나입니다. 특히 땅과 만나는 곳에서요. 메시가 지형과 교차하는 곳의 그 못생긴 폴리곤 수면선이 싸구려 게임의 대표적 징표입니다.
우리의 물 기반
우리는 물을 처음부터 만들지 않았습니다. Unity에는 실제로 Boat Attack이라는 환상적인 데모 프로젝트가 있는데, 시중 최고의 URP 물 시스템 중 하나가 포함되어 있습니다. 실제 반사, 굴절, 부력 등 다 갖추고 있죠. 그래서 Boat Attack의 물을 기반으로 시작했습니다. 바퀴를 새로 발명하면 실제 이득 없이 몇 달만 날릴 테니까요.
하지만 Boat Attack은, 뭐... 보트용으로 만들어졌습니다. 깔끔한 해안선. 모래 해변에서 멋져 보이는 해안선 동작이 Mortumus에서 실제로 원하는 진흙투성이에 갈대가 우거진 불규칙한 수로 주변에서는 끔찍하게 보입니다. 그래서 외과적으로 접근해야 했습니다.
커스텀 shader: WaterShoreline
Unity 패키지를 직접 수정하는 대신(업데이트할 때마다 망가질 테니까) 해안을 담당하는 파이프라인 부분만 교체하는 얇은 커스텀 shader "WaterShoreline"을 작성했습니다. 그 외 모든 것(반사, flow map, 커스틱)은 Boat Attack에서 그대로 가져옵니다. 필요한 부분만 오버라이드합니다.
두 가지 큰 변경사항:
2미터 거품 하드 컷오프를 없앴습니다. Boat Attack의 기본 거품 띠는 고정 깊이 컷오프가 있어서 모든 해안 주변에 균일한 "하얀 고리"가 생깁니다. 이걸 더 부드러운 falloff에 스크롤링 noise 필드를 더한 것으로 교체했습니다. 이제 거품이 점차 사라지면서 완벽한 리본 대신 유기적인 혀와 손가락 모양으로 갈라집니다.
부드러운 해안선 알파. 폴리곤 수면선이 지형과 만나는 문제요? 마지막 반 미터 깊이에서 물 자체를 투명하게 페이드시킵니다. 수면선이 완전히 사라집니다. 지형이 물 아래로 갈수록 그냥 어두워집니다. 실제 젖은 해안선처럼요.
우리의 강 시스템
Boat Attack의 물에 대해 말하자면: 기본 상태에서 바다는 아름답게 처리하지만, 강이 뭔지는 잘 모릅니다. 물이 제자리에서 잔물결칠 수는 있지만, 진짜 강처럼 하류로 흐르고 굽이를 돌 수는 없습니다. 다크 판타지 세계의 절반이 늪지대이고 강이 가득하고 젖어 있어야 하는데, 이건 문제입니다.
그래서 그 위에 강 시스템을 만들었습니다.
Mortumus의 강은 흐름 경로로 만들어집니다. 수원에서 하구까지 강의 척추를 따라가는 간단한 폴리라인 포인트입니다. 디자이너가 물이 흘러갈 곳에 포인트를 찍으면 shader가 나머지를 합니다. 수면의 모든 픽셀에 대해 흐름 경로의 어느 세그먼트가 가장 가까운지 계산하고, 그 세그먼트의 방향을 지역 흐름으로 사용합니다. 결과: 직선 구간 근처의 물은 직선으로 흐르고, 굽이 안쪽의 물은 굽이를 따라 휘어지며, 그 사이는 모두 매끄럽게 전환됩니다.
텍스처, 노멀, 거품이 모두 그 흐름 방향을 따라 스크롤되며 목적 없이 떠다니지 않습니다. 강이 어느 방향으로 흐르는지 실제로 볼 수 있습니다.
이 모든 것이 ShoreFoamTuner에서 실시간 조정 가능합니다. 물이 있는 아무 씬에나 올려놓는 작은 인스펙터 컴포넌트입니다. 거품 부드러움, noise 스케일, noise 강도, 드리프트 속도, 알파 falloff용 슬라이더가 있습니다. 머티리얼을 건드리지 않고 호수 전체의 분위기를 바꿀 수 있습니다.
커뮤니티와 트래시 토크: Chat & Social
올드스쿨 MMO는 게임만큼이나 사람에 관한 겁니다. 소셜 도구가 구리면 세계가 텅 빈 것처럼 느껴집니다.
Overhead Chat System
캐릭터 머리 바로 위에 고정된 텍스트, 이동할 때 따라가고 거리에 따라 페이드되는 텍스트. 장르의 절대적 기본이자 우리가 끝까지 지킬 것입니다.
파티를 진짜 대화로 만듭니다. 전투 중에 상대에게 트래시 토크를 할 수 있게 합니다. 죽어가는 플레이어의 마지막 말이 시스템 로그 한 줄이 아니라 바보 같고 웃긴 말이 될 수 있게 합니다. Overhead Chat System은 풀링, 거리 컬링, 앵커 트래킹을 처리해서 좁은 던전에서 스무 명이 서로 소리 질러도 잘 돌아갑니다.
멋지게 보이기
솔직히 말해봐요. 캐릭터 화면에서 민망할 정도로 많은 시간을 보내게 될 겁니다. 우리 모두 그렇습니다. 게임에서 가장 멋진 거울이니까요.
캐릭터 미리보기 시스템
우리의 페이퍼 돌은 구워진 2D render가 아닙니다. UI render texture에 렌더링되는 라이브 3D 씬입니다. 풀 라이팅, 실제 지오메트리, 모든 장비가 실시간으로 표시됩니다. 회전하고, 줌하고, 쳐다보세요. 게임플레이를 전혀 바꾸지 않으면서 게임의 소유감을 완전히 바꾸는 그런 기능입니다.
가방 채우기: Icon Studio
MMO 개발의 작은 더러운 비밀 하나: 아이콘. 수백 개가 필요합니다. 모든 검, 모든 포션, 상자에서 찾는 모든 잡템 하나하나가 복잡한 인벤토리에서 깔끔하게 읽히는 작은 64x64 사각형이 필요합니다. 그리고 전부 같은 게임에 속한 것처럼 보여야 합니다.
3D 모델을 스크린샷 찍고 끝내는 건 안 됩니다. 조명이 일관되어야 합니다. 카메라 각도가 일관되어야 합니다. 그리고(모두가 과소평가하는 부분인데) 프레이밍이 인벤토리에서 아이템이 차지할 그리드 크기에 맞아야 합니다. 1x1 단검과 2x3 대검은 완전히 다른 구도가 필요합니다. 안 그러면 둘 다 이상하게 보입니다.
우리의 솔루션: Icon Studio
Icon Studio는 한 사람(보통 중얼거리는 저)이 정신 안 놓고 일관된 아이콘 백 개를 찍어낼 수 있도록 만든 커스텀 Unity 에디터 윈도우입니다.
작업 흐름: 아이템 prefab 목록을 넣습니다. 각 아이템이 인벤토리에서 차지하는 그리드 크기를 알려줍니다: 1x1, 2x2, 2x3, 1x4, 뭐든. 카메라를 한 번 잡습니다. 프레이밍을 프리셋으로 저장합니다. 생성 버튼을 누릅니다.
핵심은 그리드 크기가 장식이 아니라 실제 render를 결정한다는 겁니다. 2x3 아이템은 512px 기준의 2배 너비와 3배 높이로 렌더링되어서, 인벤토리에 놓였을 때 비율이 늘어나지 않고 정확합니다. 장검이 진짜로 1x4 슬롯을 대각선으로 채웁니다. 포션 병이 진짜로 1x1에 맞습니다. 인벤토리가 진짜 물건을 정리하는 것처럼 느껴집니다.
게다가 이 도구는 다음도 처리합니다: 아이템별 투명 또는 커스텀 배경, 스켈레톤 기반 아이템이 게임플레이 rig를 방해하지 않고 디스플레이 포즈를 저장할 수 있는 bone pose capture, 그리고 전체 아이템 카테고리용 프리셋(모든 도끼는 같은 카메라로, 모든 포션은 다른 카메라로). 일관성이 공짜로.
최종 결과는 게임의 모든 아이콘(밀집된 인벤토리 그리드에서 32픽셀로도 잘 읽히는 것들)이 실제 인게임 모델에서, 아이템이 가방에서 차지하는 실제 형태로 렌더링되었다는 겁니다. 외주 2D 아트 없음. 어울리지 않는 조명 없음. UI에서 단검이 대검보다 큰 것처럼 보이는 일 없음.
아무도 보지 못하는 종류의 도구입니다. 그리고 인벤토리가 뒤죽박죽 스톡 아트 자루처럼 보이지 않는 이유이기도 합니다.
다음에 또
이 시스템들 중 어느 것도 Mortumus의 대표 기능이 아닙니다. 발소리가 좋아서, 혹은 스켈레톤이 물리 조각으로 폭발해서 게임을 사는 사람은 없을 겁니다. 하지만 이것들은 모든 것 아래의 뼈대입니다. 큰 것들이 그 위에 올라왔을 때 제대로 느껴지게 만드는 보이지 않는 작업입니다.
이 토대가 자리잡은 지금, Fin과 저는 2년간 노트에 스케치해온 그 음울하고 잔인한 풀루트 세계를 컴퓨터를 강에 던지고 싶지 않은 속도로 만들어나갈 수 있습니다.
-- AL