아니 그건 이미 지금도 되는거였어요

마일스톤 마감 시즌입니다. 이제 드럼통이 구를 때 소리가 완벽히 납니다에서 마감 기간의 스트레스를 관리하는 방법 중 하나를 소개했습니다. 다들 나름의 스트레스 관리 방법이 있을 테지만 마감이 다가옴에 따라 다 함께 마음이 급해지는 상황을 완화하기는 쉽지 않습니다. 이는 아마도 ‘마감’이라는 단어 자체가 가진 의미로부터 비롯된 현상이 아닐까 싶습니다. 사실 평소처럼 침착하게 일해도 될 것 같은데 다들 마음이 급해져 이상한 실수를 하기도 하고 평소 같으면 서로 잘 알아 들었을 의사소통에 실패해 이상한 일이 벌어지기도 합니다. 오늘은 이번 마감 기간에 일어난 스스로는 웃기다고 생각한 의사소통 실패 사례를 소개하겠습니다. 근데 그땐 웃기다고 생각했는데 막상 글로 바꾸려니 왜 이리 슬픈지 모르겠네요?

국내 프로젝트 중 오디오 부서를 프로젝트 내에 수직계열화 하거나 적어도 회사 단위에서 인하우스에 배치한 사례는 극히 드뭅니다. 여러 프로젝트가 생기고 사라짐에 따라 회사 자체가 생기고 사라지기도 하는 시장에서 오디오 관련 부서를 회사 안에 지속적으로 유지하기는 쉽지 않습니다. 어느 쪽이 먼저인지는 모르지만 그래서 시장에는 오디오 업무를 하는 스탭이 거의 나타나지 않으며 다시 이로 인해 오디오 관련 부서를 인하우스에 만들 생각을 하는 회사 역시 거의 없습니다. 하지만 게임에서 소리는 나야 하니 어떻게 해서든 사운드를 만들어야 하는데 주로 이 작업을 전문적으로 해 주는 업체가 있습니다. 우리들은 게임에 들어갈 오디오에 대한 요구사항을 예쁘게 정리해서 외주사에 보내고 외주사는 이에 맞게 사운드를 만들어 주십니다. 하지만 근본적으로 우리들은 게임 오디오에 비전문가들이고 외주사는 우리가 만든 게임에 익숙하지 않아 게임이 좋은 소리를 내기는 쉽지 않습니다.

지난 마감 때 완성한 빌드에는 브금(BGM)이 없었습니다. 우리가 처음으로 사운드 외주사에 여러 효과음을 요청할 시점에는 빌드가 아예 없었습니다. 우리들은 짧은 기간 안에 빌드를 만들어 이 빌드 기반으로 영상을 제작해야 하는 상황이었습니다. 그런데 완성된 빌드를 기반으로 사운드 제작을 요청하기에는 회사와 관계 있는 행사 일정 상 일정을 확보할 수가 없었습니다. 사실 지금까지 일하며 한 번도 이렇게 일 해본 적이 없었지만 우리는 아직 빌드가 없는 상태에서 컨셉용 에셋과 비슷한 게임 사례, 우리가 비슷하다고 생각하는 샘플을 정리해 빌드 없이 제작을 요청합니다. 이 의뢰를 위해 외주사 담당자님과 처음으로 회의를 하던 날 제 스스로 제가 제안하는 이 상황이 너무 황당하고또 미안해서 손발이 다 오그라들 지경이었습니다. 우리는 일정에 맞춰 사운드를 받았고 이를 그때까지 만든 빌드에 아슬아슬하게 입히는데 성공했으며 동작하는 영상에 기반해 행사 일정에 맞출 수 있었습니다.

하지만 이 때는 효과음만 요청했기 때문에 브금은 없었습니다. 어쩌면 브금이 없는 상태가 오히려 더 날것 그 자체에 가까운 상태여서 나쁘지 않았을 수도 있습니다. 행사에 제출한 빌드 이후 개발을 진행하며 게임에는 외부 NFT에 기반한 보스 몬스터가 등장했는데 아무래도 우리가 개발한 스테이지 구성 상 적어도 이 보스 몬스터가 나타날 때는 브금이 있으면 좋을 것 같다는 생각이 들었습니다. 그렇다고 브금만 덜렁 요청하긴 좀 그래서 상업적인 용도에도 무료로 사용할 수 있는 브금 음원 중 적당히 어울리는 것을 찾아다가 보스가 나타날 때 재생하기로 합니다. 이 보스 브금은 게임 전체를 통틀어 들어가는 첫 번째 브금이었습니다.

그런데 이 브금은 오직 보스가 나타났을 때, 보스와 전투 중일 때 재생해야 했기 때문에 브금을 어디서 재생할지 잠깐 망설였습니다. 이전에 경험한 전통적인 MMO 개발팀에서는 엔지니어들이 레벨 마다 브금을 설정할 필드를 만들어 주거나 몬스터 데이터에 이 몬스터가 등장할 때 재생할 브금을 설정할 필드를 만들어 주고 우리는 브금이 서로 충돌할 때 사용할 규칙을 전달하는 식으로 작업했을 겁니다. 하지만 이번에 우리들은 언리얼 엔진이 제공하는 개발환경을 더 적극적으로 사용하기로 했고 또 효과음과 브금 개발을 담당해 줄 마땅한 엔지니어가 없었습니다. 엔지니어가 없었다기 보다는 모든 엔지니어가 오디오보다는 더 중요하다고 생각하는 업무에 할당되어 오디오 재생을 도와줄 엔지니어가 없었다고 하는 쪽이 더 정확합니다.

그래서 우리는 직접 게임 내 온갖 요소에 직접 효과음과 브금을 붙이기 시작했었고 보스 브금은 고민 끝에 보스 자체에 붙인 다음 3D로 재생하게 합니다. 처음에는 보스 브금도 어쨌든 보스가 등장한 상황에 재생하는 레벨 브금이라고 생각했기 때문에 레벨 블루프린트 수준에서 재생하게 할 작정이었지만 레벨 블루프린트 수준에서 엔지니어들의 별다른 도움 없이 멀티플레이 환경에서 특정 액터에 기반한 몬스터 인스턴스가 나타났는지 안정적으로 감지하기는 생각보다 까다로웠습니다. 곰곰히 생각해 보니 우리는 브금이 이거 하나 밖에 없었고 브금을 재생할 조건은 이 보스가 나타나 전투할 때 뿐이었으니 그냥 브금을 보스 액터에 붙이고 널직한 영역에 3D로 재생하게 하면 보스가 등장할 때 브금 재생을 시작할 수 있고 보스로부터 멀어지면 브금 볼륨이 자연스럽게 줄어들며 보스에 다가가면 다시 자연스럽게 브금 볼륨이 올라가 꽤 괜찮아 보였습니다. 이 상태로 빌드를 마무리 했고 보스 브금은 별 탈 없이 재생되었으며 보스가 죽어 사라지면 자연스럽게 브금 볼륨이 줄어들어 사라졌습니다.

한편 이번 마감에 맞춰 지난 기간 동안 우리는 드디어 사운드 외주사에 제대로 된 제작 요청을 할 수 있게 됐습니다. 이전과 달리 우리는 실제 동작하는 빌드가 있었고 아트 컨셉이 단단해졌으며 이번 빌드의 플레이 시나리오 역시 꽤 단단하게 구축된 상태였습니다. 또 이 빌드가 미래에 변해 갈 모습을 꽤 자신 있게 설명할 수도 있게 되었습니다. 이전에 빌드 없이 요청한 오디오는 심혈을 기울여 제작해 주셨음에도 불구하고 사운드보다 나중에 우리가 만든 게임에 썩 잘 어울리지 않기도 했는데 원래 사운드가 만들어진 목적에 맞춰 사용하는 대신 직접 들어 보고 이 사운드가 어울릴 위치를 찾아 목적과 달리 사용했습니다. 그런데 이번에는 빌드를 직접 제시하며 오디오 제작을 요청할 수 있었고 이렇게 해서 다시 받은 사운드는 이전에 비해 훨씬 게임에 잘 어울렸습니다. 사운드를 받아 수 백 개에 달하는 음원을 쭉 재생하다가 피식 웃을 수밖에 없었는데 빌드를 안 보고 만든 사운드와 빌드를 보고 만든 사운드 사이에 그 차이가 엄청났기 때문입니다.

여기에는 레벨마다 재생할 브금이 포함되어 있었고 레벨마다 각각의 브금을 재생하도록 했습니다. 나름 심혈을 기울여 브금에 따라 로딩 화면이 시작될 때부터 재생하도록 설정하기도 하고 또 어떤 브금은 로딩이 끝나 레벨이 보일 때부터 재생하도록 설정하기도 했는데 개인적으로 이렇게 하는 편이 분위기에 더 적합하다고 생각했기 때문입니다. 이전에 경험한 전통적인 MMO 팀에서는 이런 요구사항을 반영하기 위해 엔지니어들의 도움이 반드시 필요했습니다. 이미 완전히 정의되어 구현된 규칙을 고쳐야 하기 때문입니다. 하지만 이번에는 블루프린트를 사용하고 있어 어지간한 요구사항은 엔지니어의 도움 없이 직접 만들어낼 수 있었습니다.

가령 게임을 시작할 때 타이틀 애니메이션이 멋진 소리를 내며 화면에 샥~ 펼쳐졌는데 타이틀이 화면에 다 펼쳐진 다음 클릭해서 시작하라는 메시지가 나타나고 있었습니다. 그런데 타이틀 애니메이션이 끝나기 전에 마우스로 화면을 연타하면 계속해서 마우스 클릭하는 소리가 나서 거슬렸습니다. 타이틀 애니메이션이 끝나기 전에는 클릭해도 소리를 내지 않다가 타이틀 애니메이션이 끝나고 나서 클릭하면 딱 한번 경쾌한 ‘딱!’ 소리를 내고 타이틀 메뉴로 넘어가고 싶었고 이 때에도 계속해서 클릭하더라도 더 이상 소리를 내고 싶지 않았습니다. 이전 같으면 이런 요구사항을 달성하려면 엔지니어에게 이 상황을 꽤 자세히 설명해야 했지만 지금은 그냥 직접 만들면 됩니다. 엄청 단순하지만 이는 꽤 잘 동작했고 게임의 극 초반 인상을 꽤 마음에 들게 다듬을 수 있게 해 주었습니다.

하지만 이렇게 행복한 일만 있었던 것은 아닙니다. 이전과 이전에는 그냥 쉽게 처리했던 부분들을 이제 좀 더 심혈을 기울여 설정해야 하게 됐습니다. UI 위젯을 모두 열어 애니메이션에 딱 맞춰 사운드를 집어넣고 또 게임 상의 온갖 애니메이션 몽타주에 주의 깊게 잡은 시점에 사운드를 넣어야 했습니다. 물론 이건 난이도가 높은 작업이라기 보다는 시간이 오래 걸리는 작업입니다. 여튼 주중에 작업 시간을 확보하지 못해 주말에 출근해 한 땀 한 땀 사운드를 집어 넣었고 주말이 지나고 사람들이 다시 마주친 빌드에는 이전과는 달리 여러 요소에 그럴듯한 사운드가 들어가 있었고 주말 출근은 그리 기쁘지 않았지만 그 결과물은 마음에 들었습니다.

그건 그렇고 이번에야말로 각 레벨 마다 브금을 재생하게 만들고 보니 이번에는 위에서 설명한 보스가 등장할 때 3D로 재생하는 보스 브금과 레벨 브금이 섞여 나오는 문제가 생겼습니다. 이전에는 보스에 브금을 붙여 3D로 재생해도 다른 브금이 없었으니 아무 문제가 없었지만 이제 레벨 브금이 들어간 이상 더 이상 이런 방식으로 처리할 수는 없었습니다. 하지만 여전히 레벨 블루프린트 수준에서 멀티플레이 상황에 특정 액터에 기반한 몬스터가 스폰되었는지를 클라이언트 각각이 안정적으로 감지하는 건 생각보다 훨씬 복잡한 문제입니다. 엔지니어들의 도움 없이 해결해 보려고 이것 저것 시도하다가 언리얼 엔진에 대한 이해도가 떨어지는 엔지니어가 아닌 사람 입장에서 이 문제를 제한시간 안에 해결할 수 없으리라는 판단을 해 바로 포기하고 엔지니어에게 도움을 요청합니다.

바쁜 와중에도 요청을 받은 엔지니어님은 순식간에 제가 그냥 가져다 사용할 수 있는 이벤트를 만들어 주셨는데 딱 봐도 보스 몬스터가 나타나고 사라지는 상황을 인터넷에서 찾은 튜토리얼들이 보여주는 온갖 이상한 묘기를 부리지 않고서 그냥 이벤트가 일어나면 이걸 신뢰해 사용하기만 하면 되는 모양입니다. 그래서 기쁘게 이 이벤트를 사용해 순식간에 보스가 나오는 레벨 브금을 제어하게 만들었는데 실행해 보니 생각대로 동작하지 않았습니다. 이번에도 한참을 씨름 하다가 다시 엔지니어님께 도움을 요청했지만 분명 그 분 자리에서는 잘 동작했고 제 자리에서는 잘 동작하지 않았습니다. 그렇게 한참 서로 시간을 사용하다가 이번에는 만약 이 이벤트들이 모두 정상 동작한다고 가정하고 제가 만들려던 로직을 동작하지 않을 것이 확실하지만 그냥 모두 만든 다음 엔지니어님을 모셔와 띄워 놓고 설명을 시작했습니다.

만들어 주신 이벤트는 보스 몬스터 액터 블루프린트에서 부를 수 있고 확실히 보스가 나타나는 시점과 죽는 시점을 감지할 수 있지만 이것 만으로는 레벨 브금과 보스 브금을 상황에 맞게 제어할 수가 없는 것 같다고 설명합니다. 그런데 이 설명이 채 끝나기도 전에 엔지니어님은 ‘아니 나는 보스 등장 컷씬에 브금을 깔고 싶은 건 줄 알았지’라고 말씀하시는 겁니다. 그러니까 저는 레벨 수준에서 레벨 브금과 보스 브금을 상황에 맞춰 재생하기를 원했고 그렇게 설명했다고 생각했지만 엔지니어님은 단순히 보스가 등장할 때 컷씬 앞뒤에 브금을 붙이고 싶다는 의미로 잘못 이해한 겁니다. 그래서 보스 액터 블루프린트에서 부를 수 있게 만든 이벤트로는 레벨 브금을 제어할 수 없었고 레벨 브금을 제어해 보려고 묘기를 부리려던 시도 역시 액터가 예상하지 않은 시점에 초기화되어 아무리 묘기를 부려도 도저히 만들 수가 없었습니다.

‘어… 컷씬에 브금을 넣고 싶었으면 그냥 시퀀스 에셋에 브금을 넣었겠죠..’ 라고 대답했고 우리는 서로를 바라보며 허탈하게 웃고 말았습니다. 엔지니어님은 ‘아니 내가 포커스를 잘못 이해했네. 컷씬에 브금을 넣고 싶은 줄 알았지. 기다려봐' 라며 자리로 돌아가셨고 저는 지난 몇 시간 동안에 걸친 삽질이 이렇게 허무하게 끝나 웃기면서도 한편으로는 조금 허무해져 ‘허허허’ 하고 웃고 있을 수밖에 없었습니다.

결국 이 날 레벨 브금과 보스 브금을 상황에 맞춰 예쁘게 재생하려는 목표는 달성할 수 없었습니다. 하지만 이제는 서로 요구사항을 제대로 이해했으니 이번에야말로 엔지니어가 아닌 우리들의 기술적 이해 수준으로 어떻게 해볼 수 있는 방법을 얻을 수 있을 거라고 기대합니다. 지난번 입퇴장 메시지 사례로 보는 비용예측의 어려움에서는 단순한 요구사항이라고 생각했지만 실제로 기존 기능에 통합하는 과정에서 단순한 요구사항이 아니었음이 밝혀질 수 있는 사례를 소개했었는데 이번에는 단순하다고 생각한 요구사항을 전달할 때 온전한 의사전달에 실패해 몇 시간을 소모했습니다. 상황에 관련된 모든 사람들이 한국어 네이티브 스피커들이지만 서로 방심하고 급하게 이야기할 때 무슨 일이 일어날 수 있는지 다시 한 번 생각하게 된 사건이었습니다.

결론. 제가 잘 설명했을까요? 자신도 상대도 믿으면 안됩니다.