월드 오브 워크래프트

개발자의 작업장: 월드 오브 워크래프트 컴패니언 앱 개발 이야기

개발자의 작업장: 월드 오브 워크래프트 컴패니언 앱 개발 이야기

어둠땅 출시를 맞아 월드 오브 워크래프트 컴패니언 앱에 적용한 기술적 업그레이드 중 가장 중대한 것은 아무래도 여러 확장팩에 대한 지원 기능입니다. 그동안 많은 플레이어의 요청이 쇄도한 기능이기도 하고, 오늘 이 자리를 빌려 이 정도의 대규모 기술 변경을 적용하려면 어떤 난관에 부닥치고 어떤 결정을 내려야 했는지 조금 이야기해드리고자 합니다.

약간의 배경 이야기

컴패니언 앱은 원래 확장팩, 즉 '군단' 하나만 지원하도록 고안되었습니다. 격전의 아제로스가 출시될 때까지 여러 가지 주요 백엔드 개선 사항을 먼저 처리하기로 했는데, 여기에는 앱에 PC 클라이언트와 코드를 공유하는 기능을 추가하는 것도 포함되어 있었습니다. 이렇게 하면 전에는 앱에서 액세스할 수 없었던, 메인 게임의 UI(사용자 인터페이스)에서 제공하는 다양한 기능과 도구를 활용할 수 있게 되거든요. 대신 한 번에 두 가지 이상의 확장팩을 지원하는 데 필요한 새로운 종류의 프레임워크를 구축할 수는 없다는 것이 단점이었습니다. 그래서 앱이 지원하는 단 하나의 확장팩을 원래의 '군단'에서 최신 확장팩인 '격전의 아제로스'로 바꾸었습니다.

이렇게 변경한 후 플레이어 여러분이 앱 내에서 군단 콘텐츠를 이용할 수 없게 되어 실망하셨다는 것을 잘 압니다. 그래서 어둠땅에서는 앱이 한 번에 두 가지 이상의 확장팩을 지원하게 만들기로 결심했습니다. 모바일 팀에서 커뮤니티의 요청에 부응해 군단 콘텐츠를 다시 제공하고자 하는 의지도 컸고요.

이전 확장팩의 경우 일부 기능만 지원하여 어둠땅 콘텐츠에 주력할 역량을 최대한 확보하자는 의견도 제기되었지만, 바로 가능한 많은 기능을 복원하는 것이 낫겠다는 결론을 내렸습니다. 어둠땅이 출시되면 시간여행 캠페인을 통해 부캐릭터를 레벨업할 수 있게 될 테니, 레벨업 과정에서 100% 모바일 지원이 가능한 환경을 준비하는 것이 관건이기도 했습니다.

Choose Your Expansion
어둠땅 사전 패치 출시 이후, 플레이어는 컴패니언 앱에서 군단과 격전의 아제로스 중 하나를 선택할 수 있습니다(어둠땅 콘텐츠의 경우 확장팩 정식 출시 후 가능).

군단 전용 코드가 대부분 앱에 여전히 남아있다는 점은 모두 장단점이 있었습니다. 군단 관련 어셋도 여전히 제어할 수 있는 소스에 속해 있어서 군단 콘텐츠를 다시 추가함으로써 새로 제작한 다중 확장팩 프레임워크를 테스트할 수 있는 좋은 기회였죠. 물론 이쯤 되면 구현할 것이 많이 남지는 않았지만, 군단과 격전의 아제로스를 서로 깔끔하게 분리하기 위해 몇 가지 할 일이 생긴 것은 사실이었습니다.

다중 확장팩 프레임워크를 만드는 과정은 크게 세 가지로 요약할 수 있었습니다.

  1. 앱에서 현재 확장팩 콘텐츠 데이터를 모두 지우고 서버에서 새 확장팩 데이터를 요청해야 했습니다.
  2. 확장팩별 UI 코드를 분할하여 각 기능을 따로 구분해야 했습니다.
  3. 확장팩별 어셋를 각각 나누어 앱의 리소스 사용량을 최소화해야 했습니다.

확장팩 데이터

처음에 군단 컴패니언 앱을 개발할 때만 해도, 앱의 요청을 처리하는 서버 코드는 대부분 군단 데이터만 다루도록 설계한 상태였습니다. 격전의 아제로스로 바꿀 때가 되면서 그러한 코드 함수가 대신 격전의 아제로스 데이터를 취급하도록 변경했습니다. 하지만 이번에는 어느 확장팩을 선택하든 데이터를 가져오게끔 만들어야 했습니다. 다시 말해, 모바일 요청에 대응하는 서버 코드를 모두 검토하여 데이터를 가져올 확장팩을 지정하는 매개변수를 수락하게 만든 것입니다. 예를 들어 추종자 데이터를 요청하면 추종자 유형(예: 군단 추종자 또는 격전의 아제로스 추종자)을 지정할 수 있어야 하고, 전역 퀘스트를 요청하면 퀘스트 데이터를 가져올 구역을 포함해야 했습니다.

앱 자체에도 격전의 아제로스 지원을 위해 확장된 기능들이 많았습니다. 군단의 경우 앱이 연맹 전당 리소스를 구체적으로 요청한 반면, 격전의 아제로스의 경우 그 메시지에 전쟁 자원만 추가했습니다. 이번에는 어둠땅에도 같은 메시지에 더 많은 화폐를 추가하는 방식으로 계속하는 것보다는 PC 클라이언트의 화폐 시스템 전체를 격전의 아제로스용으로 개발해 새로 만든 공유 코드 프레임워크로 옮기는 것이 낫겠다고 생각했습니다. 다시 말해, 이제는 사용자가 원하는 화폐를 수동으로 지정할 필요 없이 모든 확장팩이 확장팩별 화폐 유형을 자동으로 요청할 수 있게 되었습니다.

Before Currency Data Query
이전: 앱에서 서버로부터 특정 화폐를 요청했습니다.
After Currency Data Query
이후: 각 확장팩별로 확장팩과 관련있는 화폐를 요청할 수 있습니다. 이 코드는 어둠땅에서 화폐 시스템을 사용하는 애드온과 비슷해 보일 수 있는데, 이는 월드 오브 워크래프트 컴패니언 앱이 메인 게임과 기능을 공유하도록 하는 공유 코드 프레임워크 때문입니다.

UI 코드

격전의 아제로스 확장팩을 지원하기 위해 쓴 코드는 대부분 기존의 군단 코드를 기반으로 작성되었으므로 실제로 활발히 사용 중인 코드를 파악하기 어려웠습니다. 예를 들어 격전의 아제로스 추종자 목록에는 전과 다름없이 무장을 표시하는 기능이 있었는데, 무장 버튼이 숨겨져 있어서 문제의 코드가 실제로 호출되는 일은 없었습니다. 군단과 격전의 아제로스에 속한 각 확장팩 기능은 원래 서로 매우 비슷하기 때문에 이것이 큰 문제가 되지는 않았지만, 어둠땅에 새 기능을 추가하게 되면 이러한 형태를 계속 유지하는 것이 현실적으로 불가능하다고 판단했습니다. 군단과 격전의 아제로스가 공유하는 코드가 갑자기 영혼결속이나 성약의 단 등을 지원해야 하게 되면, 상황이 더 복잡해질 뿐입니다.

그래서 저희는 각 스크립트를 꼼꼼하게 검토해 두 확장팩이 공유하는 기능은 무엇이고 한 확장팩에만 특정된 것이 무엇인지 알아냈습니다. 확장별 코드는 하위 클래스로 분할하거나 완전히 새로운 구성요소로 나누고 상위 클래스에는 공유된 기본 기능만 남겨둔 다음, 새로 만든 하위 클래스를 사용해 각 확장팩에 새 게임 객체를 만들었습니다. 이제 같은 시스템에서 지원되고 대부분 기능을 공유하지만 군단 임무 목록에만 전투 동료 버튼이 필요합니다. 그리고 어둠땅 모험 목록으로 군단과 격전의 아제로스에서 사용한 2개의 탭 디자인을 없애고 임무 종류 아이콘 대신 적의 초상화를 표시하는 등 작업을 할 수 있게 되었습니다.

Comparison Between Legion Mission List and Shadowlands Adventures List
군단의 임무 목록과 어둠땅의 모험 목록을 비교해보세요

어둠땅 출시에 대비해 앱에 적용한, 중요하지만 눈에는 띄지 않는 변경 사항이 하나 더 있습니다. 바로 데이터베이스 파일 생성 방식을 바꾼 것인데요. 이제는 컴패니언 앱이 PC와 같은 파이프라인을 사용해 데이터베이스 코드와 데이터 파일을 구축하게 됩니다. 이것은 특히 각각의 전역 퀘스트를 표시할 지도를 결정하는 코드에 유용합니다. 원래는 앱에서 이 결정을 내릴 때 각 지도의 ID를 대상으로 수동 로직을 사용했는데, 지원해야 할 대상이 아르거스와 부서진 섬밖에 없을 때는 큰 문제가 없었지만 얼마 지나지 않아 부담스러워지기 시작했죠. 그래서 어둠땅에도 그 코드를 그대로 유지하기보다는 시스템을 완전히 동적으로 바꿔주는 UI 지도 데이터베이스 테이블을 도입하는 간단한 방법을 택했습니다. 덕분에 세 개 확장팩 전체에서 구역을 다루는 데 쓰이던 대량의 코드를 단 하나의 간결한 함수로 변환하여 확장팩별 로직 없이 각종 전역 퀘스트를 자동으로 처리할 수 있게 되었습니다.

데이터 파일

모바일과 PC 버전을 개발할 때의 중요한 차이 중 하나는, 모바일에서는 플레이어가 데이터 상한이 있거나 연결이 불량한 상황의 셀룰러 네트워크에 연결하여 앱을 사용할 수 있다는 사실을 염두에 두어야 한다는 점입니다. 즉 플레이어가 인터넷 연결 상태와 관계없이 앱을 사용하는 동안에는 당황스러운 상황에 맞닥뜨리지 않고 유쾌한 경험을 할 수 있도록 해야 합니다. 그러려면 플레이어가 앱을 사용하기 위해 다운로드해야 하는 데이터양을 제한하는 것도 한 가지 방법입니다.

확장팩마다 어셋 파일이 아주 많고 순식간에 축적될 수 있는 데다가, 앱 내에서 확장팩을 한 개만 제공하다가 군단과 격전의 아제로스로 늘리고, 나아가 어둠땅을 지원하면서 확장팩 세 개로 늘리게 되면서 앱에서 필요로 하는 데이터양도 똑같이 세 배로 늘려야 할 수 있습니다. 다만 대부분의 어셋는 확장팩 하나(예: 고화질 전역 지도 텍스처, 임무 위치 배경, 추종자 및 적의 초상화 등)에서만 사용하기 때문에 그러한 자산을 확장팩별 번들으로 분리하기로 했습니다. 이렇게 하면 앱이 현재 활성 상태인 확장팩에서 사용하는 어셋만 메모리에 로드하면 되므로 앱이 사용하는 메모리양이 줄어들게 됩니다.

또한 개발 초기 단계부터 각 확장팩을 자체적인 게임 장면으로 분할하기로 결정했는데, 이렇게 함으로써 여러 확장팩의 기능을 깔끔하게 분리할 수 있었습니다. 군단 게임 장면에는 성약의 단 호출 페이지가 필요 없고, 어둠땅 게임 장면에는 병력 증강 창이 필요하지 않습니다. 코드를 변경한 것과 마찬가지로, 이렇게 하면 언제든 앱에서 무슨 일이 벌어지는지 한눈에 알아보기 훨씬 쉬워졌습니다. 어셋와 게임 장면을 모두 이렇게 나누면서 각 확장팩이 독립적인 형태를 갖추게 되었으므로 좀 더 사용자 친화적인 다운로드 옵션을 제공할 수 있게 되었습니다.

저희는 플레이어에게 앱에서 사용할 어셋를 다운로드해야 하는 시점에 대해 좀 더 주도적인 제어권을 부여하고자 했습니다. 즉 연결 상태가 안정적일 때 모든 것을 한꺼번에 다운로드하거나, 다른 확장팩의 자산은 나중에 다운로드하여 앱에 더 빨리 접속하도록 하는 선택권을 제공하는 것입니다. 또한 특정 확장팩을 이용하지 않기로 한 경우, 해당 확장팩 자산을 강제로 다운로드해야 할 필요가 없습니다. 확장팩당 크기가 30~40MB 정도이므로 상당한 양의 데이터 다운로드를 생략할 수 있는 셈이죠!

Selective Download For Each Expansion
각 확장팩을 분리한다는 것은 곧 다운로드 시간이 짧아지고 바로 게임을 시작할 수 있다는 의미입니다!

파이프라인 변경사항

확장팩별로 어셋를 분할하려면 파이프라인의 두 부분을 변경해야 했습니다. 어셋 큐레이션 툴이 어셋가 어느 확장팩에 해당되는지를 알아야 했고, 어셋 번들 생성 툴이 최종 번들을 구축할 때 그러한 어셋를 그룹으로 묶을 수 있어야 했기 때문입니다. 어셋 큐레이션 툴도 군단과 격전의 아제로스를 지원한다는 용도로 만들어졌기 때문에, 확장팩을 가리지 않는 형태로 바꾸려면 코드를 다시 써야 했습니다. 새 버전의 툴은 컴패니언 앱에 필요할 수 있는 콘텐츠를 가지고 확장팩 목록을 검토한 다음(GarrisonType 일람표를 반복 재현하는 방법 사용), 각 확장팩 어셋를 별도의 폴더로 출력합니다. 이렇게 변경된 큐레이션 툴로 확장팩 목록 전체를 사용하게 됨으로써 앞으로 이 목록에 추가되는 값이 있으면 이를 모두 자동으로 수집할 수 있으므로 향후 툴을 계속 업데이트하지 않아도 컴패니언 앱에 새 콘텐츠를 간편하게 추가할 수 있게 되었습니다.

어셋 파일 생성과 런타임 로딩은 Unity의 어셋번들(AssetBundle) 변형 기능에 크게 의존합니다. 이 기능 덕분에 앱이 한 가지 번들 파일의 여러 버전을 마치 같은 번들인 것처럼 다룰 수 있습니다. 번들 생성 파이프라인은 확장팩마다 각기 다른 번들의 여러 변형을 만드는데, 이때 큐레이션 툴이 제공한 확장팩별 폴더 출력 데이터를 근거로 합니다. 그러한 어셋 번들은 앱에서 확장팩을 바꿀 때마다 런타임에 변경됩니다. 주어진 번들에 속하는 모든 변형을 동시에 처리할 수 있기 때문에 예를 들어 추종자 초상화를 가져와야 하는 코드인 경우 현재 로드된 추종자 초상화가 무엇인지 걱정할 것 없이 가져올 수 있습니다. 덕분에 기능 코드가 실행되고 종료되는 어셋의 실제적인 상세한 부분에 대한 걱정을 덜게 되죠. 각 확장팩은 컴패니언 앱에 존재하는 유일한 확장팩인 것처럼 보일 수 있습니다.

어둠땅으로

저희는 모바일 버전의 월드 오브 워크래프트에 더 많은 콘텐츠를 제공할 수 있게 되어 기쁩니다. 이 글을 통해 저희가 진행하는 작업을 살짝 엿보고, 현재 콘텐츠뿐만 아니라 앞으로 월드 오브 워크래프트의 콘텐츠를 지원할 수 있는 프레임워크를 고안하려면 어떤 결정을 거쳐야 하는지에 대해서도 조금 알게 되셨기를 바랍니다.

다음 글

  1. WoW 불타는 성전 클래식 서포터즈 MVP 길드를 모집합니다!
    월드 오브 워크래프트
    1일

    WoW 불타는 성전 클래식 서포터즈 MVP 길드를 모집합니다!

    월드 오브 워크래프트 불타는 성전 클래식에서 서포터즈 MVP 길드를 모집합니다! 새롭게 모험에 합류하셨거나 오랜만에 다시 불타는 성전 클래식을 찾아주신 모험가 분들과 함께 새로운 인연을 맺고 다양한 모험을 즐기실 수 있도록 동료가 되어줄 서포터즈 MVP 길드를 모집합니다.

주요 소식