menu
 

실용적인 구현: Wwise를 활용하여 세인트 로우(2022)에서 실제 라디오 재구현하기

게임 오디오

세인츠 로우(Saints Row, 2022)의 사전 제작 단계에서 시스템을 처음 설계할 때 오디오 팀은 여러 시스템의 작동 방식을 실제 세계에 맞추기로 결정했습니다. 이는 주로 팀 전체의 구조 때문이었습니다. 저희 팀에는 실제 기술을 사내 개발 엔진에 적용하는 실용적인 개발자들이 있었기 때문이죠. 저희 물리 프로그래머는 비행 시뮬레이터를 만든 경험이 있고 차량 디자이너는 엔지니어였습니다. 그래서 그들이 가진 지식을 바탕으로 시스템을 제작했죠. 저희는 이를 활용하기로 했습니다. 이미 모든 시스템이 실용적으로 작동하고 있으니 그대로 유지하자는 것이었죠.

예를 들어 차량 엔진은 실제 차량처럼 구성되어 있습니다. 단순히 점화/차단 및 속도 RTPC만 있는 것이 아니라 (물론 이것도 제공되지만), 실제 RPM 값을 얻고, 기어비, 스로틀, 서스펜션, 심지어 타이어의 미끄러짐까지 고려하죠. 심지어 보트의 프로펠러가 물에 잠겼는지 아닌지에 대한 RTPC도 있습니다.

또한 차량 충돌은 충돌 종류에 따라 각 차량에 등록됩니다. 전속력으로 운전하다가 NPC 차량과 직각 충돌할 경우 제 차량은 정면 충돌음을 재생하고 NPC는 T본 사운드를 재생하죠. 제한된 수의 에셋을 사용하여 저희는 수천만 가지에 달하는 일반 차량 충돌 소리 조합을 만들 수 있었습니다. 여기에 어떤 차량 부품이 떨어지거나 액체가 분사되는 등의 추가 효과도 함께 계산하면 어마어마하게 다양한 소리 조합 개수가 되죠.

저희는 소품 충돌에도 같은 이론을 적용했습니다. 크고 빈 나무 통이 금속 기둥에 부딪히면 정확히 그 소리가 납니다. 또한 제가 가장 좋아하는 기능 중 하나는(물론 아무도 알아차리지 못하겠지만) 총알 임팩트와 폭발이 Initial Delay 기능을 사용하여 음속으로 이동한다는 것입니다.

img1

이 이론은 전체 프로젝트에 걸쳐 유지되었습니다. 다른 화려한 것을 시도하기 전에 실제 실용적인 구현을 모든 오디오 시스템에서 고려했죠. 바로 이 때 어려운 문제가 생겼죠. 라디오 시스템을 설계해야 할 때가 온 것입니다.

세인츠 로우 라디오 - 간략한 역사

라디오 시스템을 설계하게 된 것은 경험과 타이밍이 완벽하게 맞아떨어진 결과였습니다. Volition에 합류하기 전에 저는 미디어 시장 라디오의 치열한 경쟁 속에서 프로모션을 시작으로 광고 제작과 일부 엔지니어링을 거쳐 방송 스태프 팀에 합류했습니다. 라디오가 작동하는 방식을 처음부터 끝까지 알고 있었고, 세인츠 로우 라디오는 제가 처음으로 오디오 시스템을 처음부터 끝까지 이끌고 나간 프로젝트였죠. 

이전 세인츠 로우 작품에서는 배경 시계, 타이머, 탐색 테이블 및 수백 개의 테이블 파일이 매 프레임마다 서로 통신하는 복잡한 네트워크를 가지고 있었습니다. 안을 들여다보면 거미줄처럼 복잡했어요. 거미가 재채기라도 하면 무너질 것 같았죠. 플레이어 측에서는 개별 차량 오디오가 같은 방송국을 재생하는 등의 문제가 있었지만 라디오라고 부를 수 있을 정도였습니다.

저희는 더 나은 방법을 찾을 수 있다고 생각했고, 시계 최초의 접근 방식을 고려하여 오디오 프로그래머인 마이크 너모브(Mike Naumov)를 제 사무실로 불렀습니다.

아이디어는 간단했습니다. 라디오는 말그대로 라디오입니다. 세계 안에 송신기가 있고 수신기가 돌아다닙니다. 저희는 이 둘을 연결하고 라디오 요소가 따를 수 있는 재생 목록 논리를 구성하기만 하면 되죠.

송신기

누군가 음악을 듣기 위해서는 먼저 저희가 무언가를 재생해야 했습니다. 저희는 게임 월드의 원점 아래 오브젝트를 배치하고 구식 컨트리 APM 트랙이 담긴 Random Container를 재생하는 것으로 시작했습니다. 이것이 결국 Tumbleweed 방송국으로 발전했죠. 

img2

가상 보이스 설정을 사용하여 동기화를 유지하는 것은 제 주요 작업이었습니다. 그동안 마이크는 라디오 다이얼 기능을 시작했고, 저희는 방송국 간 전환을 시험하기 위해 또 다른 오브젝트와 컨테이너를 추가했습니다.

수신기

이제 라디오를 켜면 실제로 어떻게 라디오를 들을 수 있는지를 알아내야 했습니다. 처음에는 선택한 방송국을 2D로 설정하고 나머지는 Speaker Panning/3D Spatialization Mix 기능을 사용하여 3D로 유지하는 RTPC를 설정하려고 했습니다. 하지만 NPC 차도 동일한 방송국에 주파수를 맞춰 음악이 중복 재생될까봐 걱정이 되었습니다. 이에 대한 해결책은 플레이어가 소유한 수신기에 PC/NPC RTPC를 할당하여 기본적으로 동일한 작업을 수행하도록 하는 것이었습니다.

이제 모든 차량에 배치할 수 있는 기능적인 라디오 구성 요소가 생겼고 플레이어 캐릭터의 라디오와 NPC 라디오를 구별하며 방송국 간 전환을 기능적으로 수행할 수 있었습니다. 

사내 개발 다중 위치 이미터 도구(Unreal에서 AK의 Set Multiple Positions 노드와 유사함)를 통해 저희는 새로운 게임 오브젝트를 만들 필요 없이 각 라디오 컴포넌트에 이미터 위치를 동적으로 연결해서 보이스나 오브젝트 개수를 변경하지 않고 여러 차량이 이동 중 동일한 방송국에 맞추도록 할 수 있었습니다.

img3

img4

방송국

라디오 시스템을 송신하고 청취할 수 있는 방법이 마련되었으니 이제 방송국을 구축하기 시작할 때가 되었습니다. 과거에 실제 라디오 재생 목록을 설정하고 운영하기 위해 Scott Studio를 사용했던 경험을 바탕으로 저희는 자체 라디오 시스템의 핵심 기능을 재현하기로 했습니다.

다음은 Google에서 찾은 2006년의 Scott Studios SS32 라디오 오토메이션 소프트웨어 인터페이스 스크린샷입니다. 

img5v3

(출처: https://www.devabroadcast.com/dld.php?r=759)

이 소프트웨어는 방송국 프로그래머가 광고 시간, 뉴스 시간, DJ 멘트, 날씨, 방송국 ID 등을 포함한 시퀀스를 미리 정의할 수 있게 해주며, 각 요소별로 분류되어 자동 재생 목록을 실행하거나 타이밍 혹은 요청에 따라 이를 조정할 수 있습니다. 

이를 달성하기 위해 저희는 동일한 '요소' 시스템으로 구성된 모듈형 시스템을 만들었습니다. 디자이너가 미리 정의된 순서로 요소를 배치할 수 있어 너무 많은 광고가 연속해서 재생되거나, 곡의 아웃트로가 끝난 직후 다음 곡의 인트로가 바로 재생되거나, 두 광고 사이에 방송국 ID가 재생되는 등의 상황을 방지할 수 있습니다. 이러한 모듈성 덕분에 플레이어가 생성하는 커스텀 재생 목록도 추가할 수 있다는 보너스도 있죠.

테이블 에디터에서의 스크린샷에서 볼 수 있듯이, 비언어적 요소 사이에는 뉴스 방송이 포함되어 있습니다. 이는 게임 플레이를 완료하여 방송이 잠금 해제되었을 경우에만 다음 사용 가능한 슬롯에서 뉴스 방송을 재생하기 때문입니다. 왜냐하면 플레이어의 행동이 뉴스에 언급되기 때문이죠. 마이크가 진행 팀과 작업하는 데 시간을 내어준 덕분에 이 기능을 쉽게 설정할 수 있었습니다.

img6

노래

지금까지 여러 Interactive Music 기능을 중심으로 전체 시스템을 계획했기 때문에 바로 여기서 Wwise를 본격적으로 활용하기 시작했습니다. 각 요소가 모듈형이었기 때문에 각 요소에 대해 재생 Event를 만들기만 하면 됐죠. 이들은 모두 별도의 테이블 클래스에 짝지어져 있어서 코드가 모든 선택을 수행했습니다. 각 노래는 장르에 따라 시퀀스로 네스팅된 Switch Container입니다.

img7

img8

장르가 선택되면 Switch가 해당 방송국의 오브젝트로 설정되며 각 노래의 Switch Container에 대한 재생 Event가 발송됩니다. 그런 다음 전환 효과 시간을 맞추도록 Exit 큐를 설정할 수 있고 각 DJ가 발송을 완벽하게 맞출 수 있죠 (예: 방송인의 주요 목표이자 주특기인 특정 박자에 말 멈추기).

img9

이 Exit 큐는 노래를 시작하여 아래 재생 헤드에 표시된 것처럼 DJ가 항상 발송을 맞출 수 있게 해줍니다.

img10

아웃트로에도 비슷한 작업을 했습니다. 음악이 잔잔해지기 시작하면 Exit 큐를 시작해서 DJ가 말하기 시작하도록 해줍니다. 또한 DJ 음성 버스에 사이드체인 컴프레션을 사용하여 음악이 더 풍부할 때도 DJ 목소리가 뚫고 나올 수 있게 했습니다.

img11

Exit 큐 외에도 라디오 시스템에 해당 각 트랙뿐만 아니라 요소가 끝났음을 알릴 수 있어야 했습니다. 이를 위해 특정 라벨이 있는 사용자 지정 큐를 배치하여 코드가 AK 콜백을 들을 수 있게 했습니다. 이는 트리거될 경우 시스템이 재생할 다음 요소를 선택하도록 합니다. 이 시스템은 엔진 측 처리를 크게 간소화하고 실제 라디오 DJ가 수동으로 다음 요소를 재생하거나 크로스페이드 기간을 미리 결정할 수 있는 것처럼 요소 간을 아주 자연스럽게 크로스페이드할 수 있도록 해줬습니다. 또한 모드 요소는 동일한 사용자 지정 큐를 사용하여 종료되기 때문에 코드가 매 주기마다 한 콜백만 들으면 됐습니다. 

끝맺는 말

이 모든 것들이 합쳐지면 지금까지 경험한 것 중 가장 현실적인 라디오 경험이 만들어집니다. 같은 방송국을 듣는 두 대의 차가 지나갈 때 서로 완벽하게 동기화되고, 좋아하는 노래를 재생하는 차를 탈취하면 노래의 완전한 동일한 위치에서 LPF와 볼륨 상쇄값이 바로 제거됩니다. 모든 방송국을 전환하고 원래 노래로 돌아가면 개별 행동을 고려하지 않고도 계속 방송되는 것처럼 느껴집니다. 실제로 그렇게 했기 때문이죠.

Wwise의 기능, 당시 프로젝트에서의 제 위치, 실제 이 분야에서 일한 경험, 특히 마이크의 놀라운 작업과 패러다임을 재작성하려는 의지가 완벽하게 맞춰지지 않았다면 저희는 여전히 CPU 예산에 엄청난 비용을 들여 시계를 실행하고 노래를 검색 재생하고 있을 것입니다. 보너스로 저희는 오래된 시스템에서의 모든 버그를 제거하고 라디오를 가능한 한 최대한 모듈화하여 나중에 팬들이 모드(MOD)를 만들 수도 있게 했죠. 전반적으로 자랑스러우면서도 아주 즐겁고 만족스러운 경험이었습니다. 

브렌든 엘리스 (Brendon Ellis)

시니어 테크니컬 오디오 디자이너

Volition(볼리션)

브렌든 엘리스 (Brendon Ellis)

시니어 테크니컬 오디오 디자이너

Volition(볼리션)

브렌든 엘리스는 2007년 미디어 시장 라디오 산업의 치열한 경쟁에서 벗어나기 위해 라인 테스터로서 게임 테스트를 시작했고, 그 후 오디오 테스트, 버그 수정, 그리고 사운드 디자이너가 된 후 최종 Volition의 시니어 테크니컬 오디오 디자이너가 되었습니다.

Discord: poor-old-goat#8203

MobyGames

 @The_Pie_Maker

댓글

댓글 달기

이메일 주소는 공개되지 않습니다.

다른 글

UI 설계 관점에서 UI 오디오 접근하기 - 제 2부

이 글에서는 UI 디자이너*의 관점에서 UI 오디오에 접근하는 방식을 보여드리려고 합니다. 이를 통해 심미적으로나 기능적으로 화합적인 UI를 제작하는 데에 도움이 되었으면 합니다....

20.10.2020 - 작성자: 조셉 마척(JOSEPH MARCHUK)

‘잇 테이크 투(It Takes Two)’ 사운드 비하인드 스토리 | Hazelight 오디오 팀과의 Q&A

Hazelight Studios(헤이즈라이트 스튜디오)에서 제작한 잇 테이크 투(It Takes Two)는 분할 스크린 액션 어드벤처 플랫폼 협동 게임입니다. 이 게임은 엄청나게...

5.4.2022 - 작성자: Hazelight (헤이즐라이트)

텔 미 와이(Tell Me Why) | 오디오 다이어리 제 2부: 음악

Tell Me Why의 음악은 본질적으로 캐릭터의 서사와 감정을 뒷받침하도록 설계되었습니다. 게임의 이야기는 두 주인공에게 아주 자세하게 집중되어 있으며 생각에 잠기기 쉬운 느린...

23.6.2022 - 작성자: 루이 마르탱 (Louis Martin)

텔 미 와이(Tell Me Why) | 오디오 다이어리 제 3부: 사운드 디자인

텔 미 와이(Tell Me Why)의 오디오 팀에게는 독특하면서도 인상 깊은 서사적 시퀀스를 향상시킬 수 있는 기회가 많았습니다. 저희 시네마틱 및 크리에이티브 디렉터는 영상에 꼭...

19.7.2022 - 작성자: 매튜 피오렌티니 (Mathieu Fiorentini)

AudioLink로 떠나는 여행

지난 10월 게임사운드콘(GameSoundCon)에서 저는 호텔 근처 고급 샌드위치 가게에서 데미안(Damian)과 점심을 먹고 있었습니다. 예상하셨겠지만 저희는 오디오 기술에...

10.6.2024 - 작성자: 피터 "pdx" 드레셔 (Peter "pdx" Drescher)

UE5와 C++를 활용한 WAAPI 입문

이 글에는 Unreal에서 WAAPI를 사용하는 데 필요한 모든 정보가 담겨 있습니다. 이 글의 대부분은 Audiokinetic 문서, Wwise 업 온 에어 영상, AK 블로그에...

11.6.2025 - 작성자: 하비에르 주머(Javier Zumer)

다른 글

UI 설계 관점에서 UI 오디오 접근하기 - 제 2부

이 글에서는 UI 디자이너*의 관점에서 UI 오디오에 접근하는 방식을 보여드리려고 합니다. 이를 통해 심미적으로나 기능적으로 화합적인 UI를 제작하는 데에 도움이 되었으면 합니다....

‘잇 테이크 투(It Takes Two)’ 사운드 비하인드 스토리 | Hazelight 오디오 팀과의 Q&A

Hazelight Studios(헤이즈라이트 스튜디오)에서 제작한 잇 테이크 투(It Takes Two)는 분할 스크린 액션 어드벤처 플랫폼 협동 게임입니다. 이 게임은 엄청나게...

텔 미 와이(Tell Me Why) | 오디오 다이어리 제 2부: 음악

Tell Me Why의 음악은 본질적으로 캐릭터의 서사와 감정을 뒷받침하도록 설계되었습니다. 게임의 이야기는 두 주인공에게 아주 자세하게 집중되어 있으며 생각에 잠기기 쉬운 느린...