글 소개
Spatial Audio API란?
Spatial Audio API 작업 과정
Room과 Portal
에셋 구성 및 명명 규칙
명명 규칙
Wwise 오브젝트 구성
Unreal 에디터 에셋 구성
계획하기
구역 정의하기
초기 설정
Wwise 설정
Unreal Editor 설정
구현
1 단계: Unreal Editor 측면
2 단계: Wwise 측면
3 단계: Unreal Editor 측면
테스트 / 문제 해결
Wwise RoomVerb
Room과 Portal
Ak Geometry
Ak Geometry API란?
회절 및 전달 손실
Ak Geometry API 사용 시기
구현
테스트 / 문제 해결
Unreal Editor 측면
Wwise 측면
최적화
Room 연결을 통한 AkGeometry 최적화
완전히 볼록한 볼륨에서 Diffraction 비활성화하기
바닥 표면 비활성화하기
오래된 포털 제거하기
더 간단한 지오메트리 만들기
플랫폼별 Spatial Audio 설정
월드 구성 문제
맞춤 솔루션
사용자 정의 리스너
VisualizeAkGeometry
SplineAudioWalls
무기 꼬리음 전환
마치는 말
글 소개
이 글에서는 3인칭 액션 어드벤처 게임 스카스 어보브(Scars Above)에 Spatial Audio(공간 음향) 어떻게 적용되는지와 이와 관련한 정교함에 대해 다루려고 합니다. 스카스 어보브에서는 게임 플레이 중에 다양한 물리적/음향적 특성을 지닌 지역과 공간을 탐험하게 되며, 이상적으로 이러한 특성들은 플레이어에게 전달되는 몰입감과 현실감을 높이고 깨드리지 않는 방식으로 소리 풍경에 영향을 주어야 합니다. Audiokinetic에서 Wwise 통합의 일부로 제공하는 Spatial Audio API는 제대로 구현할 경우 이러한 경험을 플레이어에게 제공하는 데 충분한 역량을 발휘하는 것으로 입증되었습니다. 저는 사운드 디자이너를 위해 이 구현의 기술적 측면에 중점을 두어 게임에서 Spatial Audio를 최대한 활용하기 위한 명확하고 간결한 안내서를 제공하고, 문제 해결과 최적화 및 Mad Head Games에서 Spatial Audio 구현 작업 과정을 더욱 개선하기 위해 제가 어떻게 작업했는지 설명해드리겠습니다.
프로젝트 설정이나 Wwise 저작 도구 및 Unreal 에디터의 배후 작업에 관해서는 깊게 설명하지 않겠습니다. Spatial Audio 구현을 전담하는 사운드 디자이너라면 Wwise와 Unreal Engine에 어느 정도 능숙해야 합니다. 이 문서에서 빠진 것이 있다면 온라인 문서에서 찾을 수 있기 때문에 초보자에게도 이 정보가 유용할 것이라고 믿습니다.
이 글은 스카스 어보브를 염두에 두고 만들었기 때문에 일부 세부 사항은 모든 프로젝트에 적용되지 않을 수 있습니다. 스카스 어보브는 Unreal Engine 버전 4.27.2를 기반으로 하며 Unreal Engine 버전 2021.1.9.7847.2311에 대한 Wwise 통합과 함께 출시되었습니다. Wwise Reflect는 사용하지 않았으며 레거시 SoundBank 시스템을 사용하여 사운드를 패키징했습니다 (Event-Based Packaging을 사용하지 않음). 간소화를 위해 모든 예시에서는 저희 리버브 처리의 주요 근원이었던 Wwise RoomVerb 플러그인을 사용하도록 하겠습니다.
Spatial Audio API란?
Spatial Audio API는 게임의 음향 환경 에뮬레이션을 위한 도구 모음을 담은 Wwise API의 일부입니다. 이러한 도구를 사용하면 게임 레벨의 물리적 환경을 보완하여 현실적인 음향 환경을 시뮬레이션하기 위해 리플렉션과 회절과 같은 사운드의 수많은 음향 속성과 그외 음향적 현상을 충실하게 재현할 수 있습니다. 이 시뮬레이션의 목적은 게임의 현실감을 향상시키고 플레이어가 공간 안에서 방향감을 가지며 주변에서 일어나는 동작에 대한 중요한 정보를 제공하는 것입니다.
Spatial Audio 구현을 담당하는 사운드 디자이너라면 이 작업 과정이 아주 익숙할 것입니다. 이상적으로는 Spatial Audio 구현 작업이 레벨의 Final Blockout 후에 시작됩니다. 모든 메시, 차단 볼륨 및 기타 지오메트리가 배치되어 레벨 전체를 플레이할 수 있는 시기이죠. Spatial Audio 구현은 블록아웃(예: 드레싱) 이후의 다른 Level Design 단계와 병행할 수 있으며 다른 부서에 종속되어서는 안됩니다. 하지만 Spatial Audio 구현은 레벨 레이아웃의 모든 변경 사항에 크게 의존하기 때문에 레벨 디자인 팀원이 계속해서 레벨을 변경할 경우 이 작업을 계속 추적해야 합니다.
Spatial Audio 구현을 담당하는 사운드 디자이너가 3D 모델링에 대한 기본 지식 혹은 Unreal Engine의 Brush Editing 도구 실습 경험을 갖고 있는 것이 좋습니다. 왜냐하면 대부분 Brush Editing 도구를 사용하여 Spatial Audio에 의해 사용되는 지오메트리를 성형할 것이기 때문입니다.
Spatial Audio API 작업 과정
Spatial Audio API에는 게임에서 원하는 수준의 음향적 현실감을 달성하기 위해 병행 활용할 수 있는 Room과 Portal 및 AkGeometry API라는 두 가지 개별적인 기능이 있습니다. 이에 대한 사용법은 이 문서의 다음 부분에서 자세히 설명해드리겠습니다.
Room과 Portal
Audiokinetic Wwise 문서에서는 다음과 같이 설명합니다.
"룸과 포털 네트워크는 주변 지오메트리에 대한 높은 수준의 추상화(혹은 낮은 수준의 세부 정보 버전)라고 생각할 수 있습니다. 룸과 포털을 레벨 지오메트리와 주의 깊게 결합하면 세부적이면서 효율적인 음향 시뮬레이션을 얻을 수 있습니다."
Room과 Portal 작업 시 사운드 디자이너의 임무는 직접 Room과 Portals을 사용하여 Sound 하위 레벨을 직접 구성하여 소위 말해 레벨의 전체 '음수적 공간(nagative space)'을 채우는 일관적인 볼륨 네트워크를 형성하는 것입니다. 이를 '음수적 공간'이라고 부르는 이유는 사운드 전달/수신기가 존재할 수 없는 고체로 형성된 물리적인 '양수적 공간(positive space)'과 달리 보통 공기로 채워진 실외/실내 공간과 같이 사운드가 전달되거나 수신될 수 있는 모든 빈 공간을 포괄하기 때문입니다.
이 게임에서 Room은 AkSpatialAudioVolume 액터 클래스로 표시됩니다. 이러한 액터는 레벨의 하나 이상의 영역을 다룰 수 있으며 해당 속성을 통해 측면과 가장자리를 기반으로 한 리플렉션, 알맞은 Wwise Aux 에셋을 추가함으로 인한 리버브, Room Tone 지정 등 여러 가지 기능을 정의할 수 있습니다. AkSpatialAudioVolume 액터에는 Late Reverb, Room, Surface Reflector라는 세 가지 주요 구성 요소가 있습니다. 이 모든 요소는 BrushComponent에 연결되어 있으며 각각 별도의 Spatial Audio 기능을 담당합니다.
반면 Portal은 보이지 않는 AkAcousticPortal 볼륨 액터로, 두 Room을 함께 연결하는 등 Room의 모든 종류의 입구를 처리하는 데 사용됩니다 여기에는 BrushComponent에 하나의 PortalComponent가 연결되어 있습니다.
이러한 모든 볼륨은 레벨에 직접 배치되며 해당 경계가 메시와 다른 볼륨과 예기치 않은 잘못된 방식으로 겹치지 않도록 '음수적 공간'을 덮습니다.
에셋 구성 및 명명 규칙
Spatial Audio 작업 과정의 일부로 다섯 가지 종류의 오브젝트와 에셋이 있으며, 그 중 2개는 Wwise 측에 있고 3개는 Unreal Editor 측에 있습니다. Wwise 측에는 Wwise RoomVerb 프리셋(ShareSets Hierarchy의 일부)과 Auxiliary Bus(Master-Mixer Hierarchy의 일부)가 있고, Unreal Editor 측에는 Audiokinetic Auxiliary Bus(.uassets 형식으로), AkSpatialAudioVolume, AkAcousticPortal(레벨의 액터 클래스 인스턴스로)이 있습니다.
Wwise 에셋:
- Wwise 리버브 (RoomVerb, Convolution Reverb) 프리셋
- Auxiliary Bus
Unreal Editor 에셋:
- Auxiliary Bus
- AkSpatialAudioVolume
- AkAcousticPortal
참고: 문서의 첫 부분에 언급했던 것처럼 Wwise RoomVerb 플러그인만 리버브 시뮬레이션을 위한 예시로서 사용할 것이지만, 버스에는 다른 종류의 시간 기반 효과를 할당할 수 있습니다.
명명 규칙
모든 종류의 Spatial Audio 에셋 이름에는 'AX'라는 접두사가 포함되어야 한다는 동의가 이뤄졌습니다. 이는 나머지 명명 규칙(효과음은 SX, 음악 트랙은 MX 등)을 대신합니다. Late Reverb가 활성화된 AkSpatialAudioVolume만 'AX' 뒤에 'LR'이 추가되며, Room으로서도 사용되는 AkSpatialAudioVolume은 이름에 'LR' 대신 'Room'이 들어갑니다. Wwise RoomVerb 프리셋과 Auxiliary Bus 에셋 이름은 동일하며 설명적인 이름은 해당 레벨에 대한 Spatial Audio Layout 문서를 기반으로 구성됩니다 (아래 '계획하기' 섹션에서 설명해하겠습니다). Unreal Editor 에셋의 이름은 반드시 Wwise의 해당 에셋과 동일한 방식으로 지정되어야 합니다.
Wwise 오브젝트 구성
Wwise RoomVerb 프리셋은 ShareSets 계층 구조의 일부이며, Wwise Authoring 도구의 Project Explorer에 있는 ShareSets 탭에서 찾을 수 있습니다. 저는 다음과 같은 방식으로 프리셋을 각 레벨에 대한 별도의 폴더에 넣어서 정리하기로 했습니다.
그림 1: Reverb ShareSets 계층 구조
기본적으로 각 레벨 구역마다 해당 레벨과 관련된 폴더에 자체적인 프리셋이 있어야 합니다. 레벨 구역 정의하기에 대해서는 나중에 더 설명하겠습니다.
여기서 사용할 또 다른 종류의 Wwise 오브젝트는 바로 Auxiliary Bus입니다. Auxiliary Bus는 Master-Mixer 계층 구조의 일부로, Project Explorer의 Audio 탭에서 ShareSets와 비슷한 방식으로 구성되어 있습니다.
그림 2: Wwise 저작 도구의 Master-Mixer Auxiliary Busses 계층 구조
각 Auxiliary Bus는 해당 레벨을 참조하는 Audio Bus의 하위 계층으로 생성되어야 합니다. 나중에 각 ShareSet 프리셋을 해당 Auxiliary Bus에 할당할 것이기 때문에 Auxiliary Bus의 이름은 해당 ShareSet 프리셋과 동일한 이름을 가져야 합니다.
- 서로 다른 구역에서 일반 Auxiliary Bus 사용하기
스카스 어보브에서는 Auxiliary Bus를 구성하고 구현하는 두 번째 접근 방식을 적용했습니다. 각 구역에 전용 Aux Bus를 생성하는 것 외에도, 각 구역마다 프리셋을 설정할 필요가 없는 상황에서 사용할 수 있는 두 개의 일반적인 Auxiliary Bus 컬렉션도 만들었습니다. 이들을 Exterior와 Interior 종류의 버스로 나누고 설명적인 이름을 부여했습니다.
그림 3: 일반 Auxiliary Busses 계층 구조
이 접근 방식의 장점은 레벨에 있는 비슷한 여러 구역에 버스를 빠르게 할당할 수 있다는 것입니다. 반면 많은 구역에서 동일한 Aux Bus를 재사용하게 되기 때문에 알맞지 않을 경우 프리셋을 편집할 수가 없습니다. 스카스 어보브에서는 보다 다양한 지형을 위한 전용 프리셋을 사용하면서 유사하고 덜 다양한 지역에서 일반 프리셋을 사용하는 적절한 절충안을 찾았습니다.
Unreal Editor 에셋 구성
앞서 말씀드린 것처럼 Audiokinetic Auxiliary Bus .uasset, AkSpatialAudioVolume, AkAcousticPortal 액터라는 세 가지 종류의 Unreal 에셋을 사용하게 됩니다.
WAAPI Picker에서 Content Browser로 Audiokinetic Auxiliary Bus를 드래그하여 생성해봅시다.
AkSpatialAudioVolume과 AkAcousticPortal은 Room과 Portal API의 일부인 액터 클래스입니다. 이를 하위 레벨에 직접 배치해봅시다.
- Content Browser 내부
WAAPI Picker를 열고 AuxBus 폴더를 찾으면 이전에 저작 도구에서 생성했던 동일한 Master-Mixer 계층 구조가 보일 것입니다. 이제 Audiokinetic Auxiliary Bus 에셋을 WAAPI Picker에서 해당 레벨의 Spatial Audio 에셋을 담을 올바른 폴더 안으로 드래그하세요. 레거시 SoundBank 기능을 사용할 경우 각 Audiokinetic Auxiliary Bus 에셋이 열리며 올바른 SoundBank가 지정될 것입니다.
그림 4: WAAPI Picker의 Master-Mixer Auxiliary Busses 계층 구조
- World Outliner 내부
레벨의 모든 Spatial Audio 액터 인스턴스(World Outliner에 열거됨)는 레벨에 배치된 후 해당 폴더로 옮겨서 Audio 폴더 내 전용 Spatial Audio 폴더 안에 그룹으로 묶어져 있어야 합니다. AkAcousticPortal만을 위한 별도의 폴더를 만드는 것이 좋습니다.
그림 5: World Outliner의 Spatial Audio 액터 인스턴스
계획하기
볼륨 네트워크를 생성하는 것이 어려운 작업처럼 보일 수 있습니다. 특히 레벨이 크고 불규칙한 영역과 교차 경로가 많은 경우 그럴 수 있습니다. 이런 공간은 매력을 더할 수 있지만 Spatial Audio 구현을 훨씬 더 어렵게 만들기 때문에 올바른 계획이 핵심입니다.
레벨을 '구역화'라고 부르는 과정을 통해 크고 작은 부분으로 나눌 것을 권장합니다. 구역 지정 단계의 최종 목표는 해당 레벨에 대한 Spatial Audio Layout이 포함된 완성된 문서를 만드는 것입니다. 이 문서는 정의된 구역 및 Room과 Portal의 위치와 함께 구역의 이름과 우선 순위를 포함해야 합니다. 레이아웃을 올바르게 스케치하려면 레벨 디자인과 관련된 기존의 모든 문서를 참조해야 합니다. 또한 레벨 디자이너나 게임 디자이너와 레벨 자체의 개념 및 레벨이 전달해야 하는 시각적인 미학 및 분위기에 대해 의논하는 것도 도움이 됩니다. 더 복잡한 레벨의 경우 쉽게 알아차리지 못하는 공간/구석/통로가 있는지 레벨 디자이너와 논의해봐야 합니다. 레벨 디자인 팀이 이미 자체적인 버전의 구역화를 만들었다면 여러분의 에셋에도 그들의 구역의 이름을 재사용하는 것이 좋습니다.
구역 정의하기
구역은 에셋 구성과 이름으로 볼 때 별도의 영역으로 처리할 수 있을 만큼 음향적으로나 시각적으로 구별이 되는 레벨의 일부를 말합니다. 구역은 레벨의 복잡도에 따라 General, Specific, Room이 될 수 있으며 각 유형은 이전 유형의 부분 집합이 됩니다. 구역은 전용 AkSpatialAudioVolume으로 표시되거나 그러지 않을 수 있으며, 반면에 Room으로 정의되거나 그러지 않을 수 있습니다. AkSpatialAudioVolume이 나타내는 구역의 유형에 따라 우선 순위가 지정되며, 일반적인 구역일수록 더 구체적인 구역보다 우선 순위가 낮습니다.
그림 6: General 구역으로 나눠진 레벨 예시
구역 유형에 따른 레벨의 우선 순위:
- 구역 (General) - 우선 순위 레벨: 1 (또는 그 이상)
- 구역 (Specific) - 우선 순위 레벨 : 2 (또는 그 이상)
- Room - 우선 순위 레벨: 3 (또는 그 이상)
참고: 같은 유형의 구역은 두 개 이상의 구역이 겹치는 경우 서로 다른 우선 순위를 가질 수 있습니다. 이 경우 어떤 구역의 우선 순위가 더 높은지 정해야 합니다. 겹치는 구역의 우선 순위가 같을 경우 시스템은 활성화되는 구역을 예측할 수 없습니다.
Specific 구역은 General 구역에 속하는 상위 계층 General 구역에 속하는 AkSpatialAudioVolume 안에서 전용 AkSpatialAudioVolume 인스턴스를 보장받고 보다 높은 우선 순위를 가질 만큼 충분히 구별되는 General 구역의 일부입니다.
그림 7: General 구역을 Specific 구역으로 나눈 예시
Room은 실내 공간과 실외이지만 대부분이 닫혀 있고 보통 포털로 다뤄야 하는 개구부로 이뤄진 공간을 나타냅니다. 이 공간은 General이나 Specific 구역의 부분 집합이며 상위 구역보다 우선 순위가 더 높습니다. 레이아웃 문서에서 이 구역은 해당 이름 및 우선 순위 번호와 함께 공간의 크기와 음향적 특성을 나타내는 공간의 스크린샷으로 표시됩니다.
그림 8: Room 모습 예시
초기 구성
게임에서 Spatial Audio 기능 구현을 시작하기 전에 프로젝트의 초기 구성 및 Wwise 오브젝트와 Unreal Engine 클래스의 매개 변수를 정의하는 것에 대해 고려해야 할 몇 가지 사항이 있습니다.
Wwise 구성
- 회절(diffraction) 및 전달(transmission) 활성화
사운드 오브젝트가 Spatial Audio의 방해(obstruction) 및 차단(occlusion)에 의해 처리되도록 하려면 Positioning 탭의 'Diffraction and Transmission' 옵션을 활성화하여 수행되는 회절 계산에 포함되어야 합니다.
그림 9: Positioning 탭의 'Diffraction and Transmission' 옵션
이는 Actor-Mixer Hierarchy의 일부인 모든 오브젝트와 AkSpatialAudioVolume에 3D 버스로서 할당되어야 하는 Auxiliary Bus에 모두 적용됩니다.
- Game-Defined Auxiliary Send 활성화하기
사운드를 Room의 Auxiliary Bus(예: Wwise RoomVerb 효과)로 전달하려면 Game-Defined Auxiliary Send가 반드시 활성화되어야 합니다. 이는 Actor-Mixer Hierarchy의 일부이며 전송하려고 하는 오디오 오브젝트와 다른 Room의 리버브로 전송하려고 하는 모든 Auxiliary Bus의 General Settings 탭에서 'Use game-defined aux sends' 옵션을 활성화하여 수행됩니다.
그림 10: 액터 믹서에서 활성화된 'Use game-defined aux sends'
이 옵션을 선택하지 않은 오브젝트는 게임에 있는 볼륨의Wwise RoomVerb 효과에 의해 처리되지 않습니다.
- 전역적 Obstruction/Occlusion 곡선
게임에 Spatial Audio가 있다는 것은 런타임 때 Spatial Audio 엔진으로 전송되는 각 Game Object에 적용되는 처리량을 결정하는 수많은 계산이 진행됨을 의미합니다. 게임 엔진이 Wwise로 전송하는 두 개의 주요 매개 변수는 Diffraction과 Transmission Loss입니다. 회절(Diffraction)은 사운드의 Obstruction 양과 관련이 있으며 Transmission Loss는 사운드의 차단(Occlusion) 양과 관련이 있습니다.
이 매개 변수가 사운드에 미치는 영향은 방해(Obstruction)와 Occlusion의 Volume, LPF, HPF 곡선에 의해 결정됩니다. 이러한 곡선은 전역적 혹은 사운드 마다 RTPC로서 정의할 수 있습니다.
전역적 Obstruction 및 Occlusion 곡선은 Wwise Project Settings의 Obstruction/Occlusion 탭에서 설정할 수 있습니다.
그림 11: Project Settings에서 정의된 전역적 Obstruction/Occlusion 곡선
이러한 곡선을 설정하면 Diffraction과 Transmission 계산을 위해 전송되는 모든 사운드에 자동 적용됩니다.
참고: Occlusion 계산의 경우 Transmission Loss RTPC 대신 전역적 Occlusion 곡선을 사용할 것을 권장합니다. 그 이유는 RTPC 곡선을 통한 Transmission Loss 계산이 각 사운드 경로마다 별도로 진행되지 않으며 대신 게임 오브젝트마다 한 값을 제공하므로 직접 경로에 실행되는 처리 또한 이미터로부터 발생하는 잠재적 회절 경로에도 영향을 주기 때문입니다. 전역적 Obstruction과 Occlusion 곡선을 사용하면 레이의 신호 처리를 독립적으로 실행할 수 있으며 전달 및 회절을 모델링할 때 정확도가 높아집니다.
Unreal Editor 설정
- 차단 재생률
Spatial Audio 방해 및 차단 처리 대신 Unreal Engine의 기본 차단 계산을 사용할 수 있습니다. 이 계산은 기본적으로 활성화되며 Spatial Audio와 함께 사용할 수 있습니다. Spatial Audio 구현 및 Wwise 프로젝트와 통합되는 방식을 비교할 때 Unreal Engine의 차단은 다소 투박하므로 Spatial Audio 회절을 사용하기로 결정했다면 Unreal Engine의 차단을 끄는 것이 좋습니다.
Unreal Engine의 차단은 게임에서 Occlusion 카테고리에 있는 Ak Component의 'Occlusion Refresh Interval' 매개 변수 형식으로 AkComponent의 각 인스턴스에 적용됩니다. 기본값은 0.2초입니다. 즉, 매 5분의 1초마다 해당 AkComponent의 새로운 Occlusion 값이 계산됩니다. 이 값을 0으로 설정하면 Unreal Engine의 차단이 완전 비활성화됩니다.ㄴ
그림 12: AkComponent의 'Occlusion Refresh Interval'을 0으로 설정
이 작업이 게임에서 각 AkComponent마다 실행되어야 하기 때문에 프로그래밍 팀의 동료에게 AkComponent.cpp의 생성자 안에 있는 매개 변수 기본값을 0.0f으로 변경하도록 부탁하면 추후에 따로 걱정할 필요가 없습니다.
- 충돌(Collision) 프리셋 사용하기
충돌 프리셋은 모든 Spatial Audio 액터에서 올바른 충돌을 설정하는 데 유용합니다. Spatial Audio에 대한 전용 프리셋을 설정하면 처음부터 충돌이 항상 올바르게 구성되기 때문에 다른 개발자가 충돌 설정을 변경하더라도 볼륨이 변경될 지 걱정할 필요가 없습니다.
스카스 어보브에서는 SpatialAudioVolume과 SpatialAudioVolumeBlock이라는 두 개의 충돌 프리셋을 정의했습니다. AkSpatialAudioVolume은 아무것도 차단할 필요가 없으며 단지 겹쳐지는 모든 Game Object를 등록해야 하기 때문에 SpatialAudioVolume 충돌 프리셋에 있는 모든 Trace Type이 Ignore로 설정되어 있지만, Weapon Tail 전환과 AudioTrace 디버깅은 사용합니다. 이는 Overlap으로 설정되어 있습니다.
SpatialAudioVolumeBlock 충돌 프리셋에서는 이름에서 알 수 있듯이 AudioTrace가 Overlap 대신 Block으로 설정되어 있으며 나머지는 Ignore로 설정되어 있습니다. 이 프리셋은 모든 볼륨 및 AkGeometry로 전송되어야 하는 다른 오브젝트에 사용되어 리스너가 지오메트리 안으로 들어가는 것을 방지합니다. 이는 문서의 끝부분에서 'Custom Listener' 통합의 일부로 더 자세히 설명해드리겠습니다.
그림 13: SpatialAudioVolume 및 SpatialAudioVolumeBlock 충돌 프리셋
액터에서, 특히 맵의 인스턴스에서는 Custom 충돌을 사용하지 않는 것이 좋습니다. Custom 충돌을 사용하면 개발 후반에 변경 사항을 추적하기가 훨씬 어려워지며 Collision 프리셋에 대한 잠재적인 변경 사항이 해당 액터에 적용되지 않습니다.
구현
1 단계: Unreal Editor 측면
이 단계의 목표는 Room과 Portal의 기반을 생성하도록 AkSpatialAudioVolume을 사용하여 레벨을 완전히 덮는 것입니다. 이러한 볼륨이 Room으로 간주될지의 여부는 레이아웃 문서의 정보를 기반으로 사운드 디자이너가 결정하게 됩니다. 보통 실외 공간에 사용되어 Late Reverb를 시뮬레이션하는 AkSpatialAudioVolume은 Room으로 간주되지 않으며 해당 영역의 윤곽을 엄격히 따를 필요가 없습니다. 반면, Room으로 간주되는 AkSpatialAudioVolume은 실내 공간에 더 많이 사용되며 해당 공간의 곡률을 엄격히 따라야 합니다.
그림 14: Late Reverb만 시뮬레이션하는 AkSpatialAudioVolume 네트워크
그림 15: Room만 포함하는 AkSpatialAudioVolume 네트워크
- 레벨에 AkSpatialAudioVolume 액터 배치하기
액터 인스턴스로 레벨을 구성하기 전에 먼저 올바른 하위 레벨에 있는지 확인해야 합니다. 이를 선택하기 위해 Window 드롭다운 메뉴에서 Levels 탭을 선택합니다. 이 안에 사운드 하위 레벨이 있습니다. 이를 더블 클릭하면 Viewport의 오른쪽 아래 모서리에 이름이 표시되어 선택이 되었음을 확인해줍니다.
그림 16: 올바르게 선택된 사운드 하위 레벨
AkSpatialAudioVolume 액터는 Place Actors 패널에서 해당 액터를 레벨로 드래그하여 놓아서 배치할 수 있습니다.
그림 17: Place Actors에서 AkSpatialAudioVolume 액터를 선택
액터 인스턴스를 레벨에 추가할 때 액터의 중심점이 해당 영역의 중앙에 가깝도록 배치해야 합니다. 중심점은 X, Y, Z 값으로 액터의 위치를 정의하기 때문에 중요하며, Profiler 뷰에서 볼륨의 위치 계산과 Visualize Rooms and Portals와 같은 디버깅 도구에 사용됩니다. 또한 중심점은 볼륨 자체에서 룸 톤으로서 이벤트를 발송하고자 할 경우 중요합니다 (Room Tone 기능에 대해서는 나중에 더 설명하겠습니다).
레벨에서 액터를 배치한 후에는 해당 인스턴스가 World Outliner에서 선택된 것이 보이며 이에 대한 Details 탭이 열릴 것입니다. 여기에서는 몇 가지 설정 중에서 선택할 수 있습니다.
- 해당 인스턴스가 고유한 표면을 가질 것인지 (Surface Reflector를 활성화)?
- 해당 인스턴스가 Late Reverb Aux Bus로 전송할 것인지 (Late Reverb를 활성화)?
- 해당 인스턴스가 Room처럼 작동할 것인지 (Room을 활성화)?
그림 18: AkSpatialAudioVolume 설정
'Enable Surface Reflectors' 옵션은 볼륨의 표면을 지오메트리로서 사용하며 음향 텍스처 등으로 음향 속성을 정의하는 것과 관련됩니다. 'Late Reverb' 옵션은 이 볼륨이 리버브 효과를 생성할지의 여부를 결정하는 것과 관련됩니다. 레이아웃 문서에서 특정 공간을 설명하는 데 사용되는 모든 AkSpatialAudioVolume은 음향적 속성도 시뮬레이션해야 한다고 가정할 수 있기 때문에 이 설정을 활성화하는 것이 합리적입니다. 'Enable Room' 옵션은 앞서 언급한 것처럼 이 영역을 Room으로 처리할 것인지의 여부와 관련됩니다.
Details 탭에 있는 이러한 설정과 더불어 'Collision Presets' 드롭다운 메뉴를 클릭하여 이전에 만든 'SpatialAudioVolume' 프리셋을 선택하여 BrushComponent의 충돌 프리셋을 설정해야 합니다.
그림 19: 이전에 설정한 AkSpatialAudioVolume 충돌 프리셋
그런 다음 Spatial Audio Layout 문서에 따라 Late Reverb와 Room 컴포넌트의 Priority 번호를 설정해야 합니다.
그림 20: 올바르게 설정된 AkSpatialAudioVolume Late Reverb 및 Room 우선 순위
이제 볼륨에 액터 태그를 추가해야 합니다. 이는 Weapon Tail 전환에 사용될 Interior/Exterior 상태를 Wwise에서 설정하는데 사용됩니다 (이에 대해서는 '맞춤 솔루션' 섹션에서 더 설명해드리겠습니다). 볼륨의 속성을 기반으로 (실외/실내인지 그리고 크기에 따라) 4개의 다른 볼륨 유형에서 선택할 수 있습니다.
- Exterior;
- Interior_Large;
- Interior_Medium;
- Interior_Small.
그림 21: AkSpatialAudioVolume에 추가된 Interior/Exterior 태그
마지막 단계는 명명 규칙에 따라 World Outliner에서 해당 인스턴스의 이름을 재지정하는 것입니다 (접두사 'AX' 다음에 Room 설정에 따라 'LR'이나 'Room'이 오고 나머지 이름은 레이아웃 문서에서 따옴). 그런 다음 World Outliner에서 해당 인스턴스를 Audio / SpatialAudio / <Level> 폴더로 옮겨야 합니다 (그림 5 참조).
- Brush Editing 도구를 사용하여 볼륨 형성하기
이 단계에서는 볼륨이 차지하는 공간이 공간의 윤곽을 따르도록 볼륨을 수정해보겠습니다. 액터가 Room이 아닐 경우 Spatial Audio Layout 문서에서 정의된 General이나 Specific 구역의 선을 따르는 것으로 충분합니다. 액터가 Room일 경우 해당 영역의 가장자리를 밀접하게 따라가도록 더 많은 노력을 투자해서 볼륨이 해당 영역을 아주 유사하게 포함하도록 해줘야 합니다.
이는 Unreal Editor의 Brush Editing 도구를 사용하면 가장 쉽게 수행할 수 있습니다. 아쉽지만 이 기능을 자세히 살펴보려면 문서의 범위가 너무 넓어지게 되므로 다루지 않겠습니다. 위에서 언급했듯이 Spatial Audio 구현을 전담하는 사운드 디자이너는 이 도구에 충분히 익숙해져야 합니다. 꼭짓점을 옮기고 면을 압출시키기는 작업 준비를 하는 데 도움이 되는 훌륭한 온라인 튜토리얼이 많이 있습니다. 당연히 연습이 가장 중요합니다. 처음에는 어렵게 느껴질 수 있지만 노력할 만한 충분한 가치가 있습니다.
다음은 도움이 되는 몇 가지 팁입니다.
1. Brush Editing 도구에 대한 단축키는 UE 버전 4.x에서 Shift+4이며 UE 버전 5.x에서는 Shift+7입니다.
2. AkSpatialAudioVolume의 Details 탭에는 해당 볼륨을 제외한 모든 액터를 숨기고 Brush Editing 모드를 실행하는 'Enable Edit Surfaces'라는 버튼이 있습니다. 'Disable Edit Surfaces'를 클릭하면 도구를 종료하며 이전에 숨겨진 액터가 다시 나타납니다.
그림 22: AkSpatialAudioVolume의 Edit Surfaces 버튼
3. Room 볼륨을 형성할 때 수직 가장자리 끝의 아래쪽과 위쪽 꼭짓점을 모두 선택하여 동시에 옮기는 것이 가장 쉽습니다. 이렇게 하면 꼭짓점을 동일 평면에 유지하여 삼각형이 덜 생성됩니다.
GIF 1: 두 꼭짓점을 동시에 옮김
4. 두 꼭짓점 선택하기는 Viewport의 Orthographic Top 혹은 Bottom 뷰에서 쉽게 실행할 수 있습니다.
GIF 2: Top Orthographic 뷰에서 수직 꼭짓점 선택하기
5. 저는 공간의 주요 개구부 중 하나를 처리한 다음 거기에서부터 다른 곳을 처리하려고 합니다. 가장자리를 개구부에 고정하면 개구부 전용 표면이 있기 때문에 포털이 올바르게 배치되었는지 걱정할 필요가 없습니다.
6. 압출 작업은 새로운 표면을 추가하는 가장 쉬운 방법이며 추가 성형을 위한 더 많은 꼭짓점을 제공합니다. 하지만 압출시키려는 표면에 주의를 기울여 과도하게 사용하지 마세요. 볼륨이 너무 복잡해지고 수정하기 어려워질 수 있습니다.
7. 작업을 끝내고 나면 더 이상 사용되지 않는 꼭짓점이 있는지 찾아보세요. 이를 지우는 대신 유지하려는 가장 가까운 꼭짓점을 찾아 중복된 꼭짓점을 용접하세요.
GIF 3: 사용하지 않는 꼭짓점 용접하기
모양 형성이 완료된 에셋은 해당 영역을 충분히 덮어야 하며 가장자리를 밀접하게 따라가면서 인접한 공간으로 넘어가지 않고 다른 Room과 겹치지 않아야 합니다. 겹치는 Room은 포털이 다루지 않는 공간에서 문제를 일으킬 수 있습니다. 이미터나 리스너가 있는 공간의 경우 더욱 특별한 주의가 필요합니다. 갑작스럽게 사운드가 감소되어 볼륨이 갑자기 줄어들거나 원치 않는 필터링이 일어나지 않도록 주변 벽에 완벽하게 맞지 않게 볼륨을 조정해야 할 수도 있습니다.
이 문제는 이미터나 리스너가 Room의 반대편으로 가거나 포털에 덮이지 않은 표면을 통해 겹치는 Room으로 들어갈 경우 발생할 수 있습니다. 볼륨은 눈에 보이지 않기 때문에 리스너와 이미터 간에 표면이 있다는 사실을 인식하지 못할 수 있습니다. 리스너와 이미터를 서로 다른 Room에 두면 서로 시야에 있더라도 그 사이의 가장자리 주위에 새로운 직접 및 회절 경로를 계산해야 합니다. 포털이 없을 경우 이러한 경로는 너무 방해(obstruction)되거나 이미터 사운드가 리스너에게 들리기에 너무 길 수 있습니다.
Audiokinetic은 이러한 수작업이 얼마나 귀찮은지를 잘 알기 때문에 이 과정의 속도를 높여주기 위한 도구를 제공하기 위해 최대한 노력하고 있습니다. AkSpatialAudioVolume과 AkAcousticPortal에 있는 'Fit to Geometry' 옵션은 정육면체 모양의 공간과 복도로 이뤄진 빌딩같은 간단한 지오메트리를 작업할 경우에는 굉장히 유용하게 느껴질 수 있지만 개구부와 구석진 곳, 구불구불한 터널이 있는 동굴같이 불규칙하고 복잡한 영역에서는 잘 작동하지 않을 수 있습니다. 결과적인 볼륨에 분명히 추가로 수작업을 해야 하기 때문에 게임에서 사용하는 것을 제안할 이유가 없습니다.
GIF 4: 잘 배치된 AkSpatialAudioVolume의 예시
- 레벨에 AkAcousticPortal 액터 배치하기
AkSpatialAudioVolume과 마찬가지로 AkAcousticPortal 액터는 Place Actors 패널에서 해당 액터 유형을 선택하고 레벨로 드래그하여 놓아서 배치할 수 있습니다.
액터 인스턴스를 생성한 후에는 World Outliner에서 해당 인스턴스가 선택된 것이 보이며 이에 대한 Details 탭이 열릴 것입니다. 이 안에서는 Portal의 Initial State가 Open이나 Closed가 되도록 정의하고 (Open으로 기본 설정됨) 올바른 SpatialAudioVolume Collision Preset을 선택해야 합니다.
다음 단계는 명명 규칙에 따라 World Outliner에서 해당 인스턴스의 이름을 재지정하는 것입니다 (접두사 'AX_Portal'를 붙인 후 나머지 이름은 레이아웃 문서에서 따옴). 그런 다음 World Outliner에서 해당 인스턴스를 Audio / SpatialAudio / <Level> / Portals 폴더로 옮겨야 합니다 (그림 5 참조).
이제 액터의 위치를 이 포털에서 표현하려는 개구부의 위치로 변경해야 합니다. Translate, Rotate, Scale 도구를 사용해서 개구부를 완전히 덮도록 형성해보겠습니다. 포털의 Y축은 개구부와 수직이 되어 한 공간에서 다른 공간으로의 전환을 따라야 합니다. 또한 포털의 전면을 정의하는 X축의 방향에도 주의를 기울어야 합니다. 액터는 Viewport에서 방향을 잘 볼 수 있도록 노란색 리본으로 표시됩니다.
그림 23: 잘 배치된 AkAcousticPortal의 예시
X축의 크기를 정의하면 포털의 너비를 정의할 수 있습니다. 이 너비는 두 음향 공간 사이의 전환이 발생하는 영역을 나타내며 크로스페이드의 공간적 대응이라고 이해하시면 됩니다. 포털이 더 깊을수록 전환 효과가 더 점진적으로 진행됩니다.
AkAcousticPortal에는 액터를 올바르게 배치했는지 여부를 나타내는 색상 표시기가 있습니다. 모든 포털에는 적어도 한 볼륨이 추가되어야 합니다. 또한 뒷 공간과 구별되는 앞 공간이 있어야 합니다. 포털에 연결된 볼륨이 없거나 볼륨 사이에 제대로 배치되지 않은 경우 포털이 빨간색으로 표시됩니다.
GIF 5: AkAcousticPortal 배치 표시기
참고: AkAcousticPortal은 인접한 AkSpatialAudioVolume당 정확히 한 가장자리를 덮는 방식으로 배치된 경우에만 제대로 작동합니다. 잘못 배치될 경우 볼륨의 면이 Portal과 교차하는 지점에 리스너가 있을 경우 사운드가 잘려버릴 수 있습니다. AkSpatialAudioVolume을 모델링할 때는 각별한 주의가 필요합니다. 볼륨의 면 중 하나만 전체 개구부를 덮는 방식으로 볼륨을 변경할 수 있어야 하기 때문입니다.
두 개의 인접한 Room을 형성하여 네트워크를 만들 경우 이 Room 사이에 빈 공간이 없도록 개구부에서 연결하는 것이 가장 좋다는 것을 발견했습니다. 이렇게 하면 전환이 어디에서 발생하든 포털을 통해서만 전환되고, 포털에 포함되지 않는 Room의 표면을 통해서는 전환 되지 않도록 보장됩니다.
GIF 6: 두 사이에 공백이 없는 인접한 Room
2 단계: Wwise 측면
이제 Wwise Authoring 도구로 돌아가서 각 AkSpatialAudioVolume에 대한 Auxiliary Bus와 전용 Wwise RoomVerb ShareSet 프리셋을 생성하고 매개 변수를 정의해봅시다.
- Aux Bus 생성하기
'Wwise 오브젝트 구성' 섹션에 있는 단계를 따르면 Auxiliary Bus의 이름이 모두 올바르게 지정되어 있고 Master-Mixer 계층 구조의 올바른 위치에 있어야 합니다 (그림 2 참조). 각 Auxiliary Bus의 Positioning 탭에는 Positioning, Attenuation 및 Diffraction에 대한 설정이 있습니다. 여기에서 'Listener Relative Routing'을 활성화하고 '3D Spatialization'을 'Position + Orientation'으로 설정해야 합니다.
Wwise 버전 2019.2부터는 Auxiliary Bus에 감쇠 곡선을 꼭 지정하지 않아도 됩니다. 이미터 지점에서 리스너 지점까지의 거리가 계산되며 해당 거리는 이미 이미터에 적용된 감쇠에 사용됩니다. Auxiliary Bus에 Attenuation 곡선을 적용하면 포털을 통해 나오는 리버브가 추가로 처리되기 때문에 이미터의 원본 감쇠가 충분히 처리되지 않는다고 생각될 경우 Attenuation 프리셋을 추가하세요.
회절과 전달 손실이 포털을 통해 전달되는 리버브 볼륨을 변경하도록 하려면 Enable Diffraction을 선택해야 합니다.
그림 24: 올바르게 설정된 Auxiliary Bus의 Positioning 탭
다른 볼륨의 RoomVerb 효과로 처리하려는 모든 리버브 효과에 대해 Auxiliary Bus의 General 탭에서 'Use game-defined aux sends'를 반드시 선택해야 합니다.
그림 25: Auxiliary Bus에서 활성화된 'Use game-defined aux sends'
- Wwise RoomVerb ShareSet 프리셋 생성 및 할당하기
Wwise RoomVerb 프리셋은 이전에 정의된 방식으로 ShareSets 탭에 생성됩니다. 해당 매개 변수는 볼륨의 음향 속성 및 사운드 디자이너의 미적 선호도에 따라 정의됩니다 (그림 1 참조).
Auxiliary Bus의 Effects 탭에서 Wwise RoomVerb 플러그인 인스턴스를 할당하고 올바른 ShareSet 프리셋을 선택해야 합니다.
그림 26: 올바르게 할당된 Wwise RoomVerb 프리셋
3 단계: Unreal Editor 측면
- Auxiliary Bus 생성 및 할당하기
이 단계에서는 Unreal Editor에서 Auxiliary Bu 에셋을 생성해야 합니다. WAAPI Picker에서부터 Content Browser의 알맞은 폴더로 Auxiliary Bus를 드래그하여 놓고 SoundBank에 추가하세요 (필요에 따라). 그런 다음 이 Auxiliary Bus를 해당하는 AkSpatialAudioVolume에 할당할 수 있습니다.
버스를 할당하기 위해서는 볼륨을 선택하고 Details 탭에서 'Late Reverb' 카테고리를 찾아서 Auxiliary Bus를 드래그하거나 이름으로 검색하여 Aux Bus 속성에 추가해야 합니다.
그림 27: 올바르게 할당된 Auxiliary Bus
- 룸 톤(Room tone)
이미 위에서 AkSpatialAudioVolume의 올바른 배치와 레벨에서의 위치가 중요하다는 것을 언급했습니다. 볼륨의 위치와 회전은 Room tone이라는 기능을 사용하여 볼륨 자체에 바로 AkEvent를 전송하기로 한 경우에 사용됩니다. Room tone이 볼륨의 위치와 회전에 대한 정보를 사용하기 때문에 볼륨의 전면은 사운드의 전면 방향이 됩니다. 사운드의 Positioning 탭에서 'Position + Orientation'을 선택할 경우 공간에 있는 동안 사운드의 스테레오 이미지가 공간과 함께 회전하기 때문에 사운드가 공간에 고정되어 있어 더욱 사실적이게 느껴집니다.
일반 AkAmbientSound와 Room tone의 주요 차이점은 바로 리스너가 볼륨 안에 있을 때마다 Room tone과 리스너 사이의 거리가 항상 0으로 평가된다는 것입니다. 리스너가 볼륨에서 나가면 가장 가까운 포털에 이미터가 배치되며 포털에서부터 리스너로의 거리가 계산됩니다. 그러니 Room tone의 감쇠 곡선을 설계할 때 이를 염두에 두세요.
시험 / 문제 해결
Wwise RoomVerb
Wwise Authoring 도구에서 프리셋을 편집할 때 매개 변수 변경 사항을 들을 수가 없기 때문에 플레이 세션 도중 매개 변수를 시험해봐야 합니다. 세션을 시작하고 Wwise Profiler에 연결해서 게임을 플레이하는 도중 해당 효과의 값을 변경해야 합니다. 볼륨 사이에 이동하고 필요한 경우 트리거할 수 있으며 뚜렷한 트랜션트가 있는 위치 지정된 사운드가 있는 경우 리버브를 자극하여 듣는 것이 가장 쉽습니다. Scars Above에서는 Player Character를 제어할 수 있으며 언제든 사용할 수 있었기 때문에 Kate의 근접 공격 우쉬(whoosh) 사운드를 사용했습니다.
Room과 Portal
Room과 Portal 문제 해결은 대부분 레벨에서 AkSpatialAudioVolume으로 적절하게 처리되지 않는 부분을 찾는 것으로 구성됩니다. 커스텀 도구를 사용하지 않으면 이 검색 작업은 리스너(일반적으로 카메라의 스프링 암에 부착됨)를 직접 작동시켜서 볼륨의 면과 주변 벽이 만나야 하는 구역의 가장자리를 따라 이동하는 수동 작업으로 진행됩니다. 게임 플레이 도중에는 볼륨이 눈에 보이지 않기 때문에 귀에 의존하여 소리에 문제가 있는지 찾아야 합니다. 이러한 문제는 포털이 아닌 표면을 통해 볼륨을 나갈 때 Diffraction과 Transmission Loss 값이 갑자기 높아져서 볼륨이 갑자기 감소하거나 처리가 갑자기 변화하는 것으로 나타날 수 있습니다. 문제 영역을 찾고 나면 플레이 세션을 멈추고 볼륨을 더 변경하여 해당 영역이 올바르게 덮이도록 한 후 다시 시험해봐야 합니다.
볼륨이 공간을 충분히 덮고 있지 않은 곳을 식별하는 데 유용한 지표는 편집할 때 Viewport에서 볼륨의 가장자리가 표시될 경우입니다. 가장자리는 노란색 선으로 표시됩니다. 지오메트리에서 튀어나온 선이 보이면 리스너가 선으로 연결된 표면을 통해 볼륨에서 벗어나서 볼륨이 덮이지 않는 곳으로 나갈 수 있으며, 이로 인해 사운드에 문제가 발생할 가능성이 높습니다.
그림 28: 주변 지오메트리에서 돌출된 AkSpatialAudioVolume의 가장자리
함께 작업하는 팀이 보이지 않는 블로커와 같이 카메라(즉, 리스너)를 블로킹하는 데 다른 방법을 사용하는 경우 해당 액터에 따라 볼륨을 정렬해볼 수 있습니다. 하지만 제 경험상 볼륨을 게임과 에디터에서 모두 눈에 보이는 Static Mesh에 맞추는 것이 리스너가 볼륨의 벽을 통과할 수 없도록 아주 안전하게 작업하는 방법입니다. 물론 여러분의 경우 다를 수 있기 때문에 반드시 많이 시험해보세요.
- Visualize Rooms and Portals(Room과 Portal 시각화하기)
Wwise Unreal 통합과 함께 제공되는 유용한 도구 중 하나는 Visualize Rooms and Portals(Room과 Portal 시각화하기) 입니다. Project Settings에서 이를 활성화하면 레벨을 탐색하면서 AkAcousticPortal 액터 인스턴스와 인접한 공간으로의 연결을 눈으로 확인할 수 있습니다. AkSpatialAudioVolume의 경계를 표시할 수는 없지만 이 도구가 제공하는 정보로 포털과 중심점이 잘 배치됐는지 확인할 수 있기 때문에 여전히 매우 유용합니다.
그림 29: 게임 플레이 도중 활성화된 Visualize Rooms and Portals 옵션
Visualize Rooms and Portals는 Wwise Integration Settings의 일부이며 이를 활성화하면 DefaultGame.ini이 변경되며 저장소에 커밋됩니다. 그러니 전체 팀이 포털을 볼 수 있게 하려는 것이 아니라면 (아마도 그럴 경우 QA에서 호출을 받을 거예요!) 커밋하기 전에 먼저 비활성화하세요.
프로그래밍 팀에 여유 시간이 있을 경우 Spatial Audio에 대한 커스텀 디버깅 도구를 만드는 것을 적극 권장합니다. 이를 위해 저는 프로그래머들의 도움을 받아 VisualizeAkGeometry라는 Spatial Audio를 시각화하기 위한 맞춤형 솔루션을 고안 및 구현했습니다. 이 도구는 문서 마지막 부분에서 다른 커스텀 도구와 함께 설명해드리겠습니다.
Ak Geometry
Ak Geometry API란?
Ak Geometry API는 고체 장애물 주변의 소리 회절 효과를 시뮬레이션할 수 있을 뿐만 아니라 Room과 Portal API와 함께 작동하여 해당 장애물의 표면으로부터의 리플렉션까지 시뮬레이션할 수 있는 Wwise 도구 세트입니다.
회절 및 전달 손실
회절은 이미터에서 리스너로까지의 경로에서 음파가 장애물을 만나 방해되고 특정 각도로 장애물의 가장자리 주위로 구부러져 더 낮은 볼륨과 제한적인 주파수 스펙트럼으로 리스너에게 도달되는 현상입니다. 장애물이 소리 통과를 허용하지 않는 물질로 만들어진 경우 직접 경로보다 회절 경로가 사운드의 주요 음원으로서 우선 순위가 높으며 (가상) 이미터가 장애물 가장자리에 배치됩니다.
전달 손실은 이미터와 리스너 사이의 장애물이 충분히 커서 사운드가 가장자리 주변으로 휘어질 수 없어 장애물을 통과하는 직접 경로만 남을 경우 발생합니다. 장애물 재질의 특성에 따라 사운드가 부분적으로 혹은 완전히 차단되며, 이로 인해 볼륨도 더 낮아지며 주파수 스펙트럼도 제한됩니다.
Transmission Loss와 함께 Diffraction은 Ak Geometry API의 일부로서 Wwise 안에서 차단 및 방해 매개 변수를 정의하고 Unreal Engine의 차단 시스템을 완전히 대체합니다. 이러한 매개 변수를 사용하면 Wwise 오브젝트의 Volume, HPF 및 LPF 곡선을 형성하여 방해 및 차단의 음향적 현상을 정확하게 시뮬레이션할 수 있습니다.
Ak Geometry API 사용 시기
새로 만든 Room 중 하나의 내부에 있다고 가정해보겠습니다. 그 중앙에 Static Mesh로 구성된 돌기둥이 하나 있고 이 주변으로 사운드가 휘어지고 반사되도록 하고 싶다고 해봅시다. 여기에 AkGeometry 컴포넌트를 추가하면 메시의 충돌을 받아 Spatial Audio가 읽을 수 있는 지오메트리로 변환하도록 할 수 있습니다. 이 지오메트리는 Wwise 엔진에서 표현된 레벨 지오메트리의 근사치 역할을 하며, 직접 및 회절 경로 계산과 Diffraction 및 Transmission Loss 매개 변수 값 설정에 사용됩니다.
이보다 더 나은 사용 사례는 Late Reverb 시뮬레이션에만 사용되는 볼륨으로 덮인 실외 공간과 같이 현재 회절이 진행되지 않는 영역에서 사용하는 것입니다. 이 경우 Spatial Audio 계산에 포함하고자 하는 모든 Static Mesh에 AkGeometry를 직접 추가하게 됩니다. 복잡한 메시로 구성되지 않은 레벨의 경우 이 솔루션은 빠르고 쉽습니다. 삼각형이 많은 메시에서는 AkGeometry 컴포넌트를 추가하는 비용이 너무 많이 들 수 있습니다. 바로 여기에서 Brush Editing 실력을 통해 AkSpatialAudioVolume을 사용해서 훨씬 덜 복잡한 지오메트리를 만들고 장애물을 덮을 수 있습니다.
Room과 Portal을 Ak Geometry 컴포넌트 및 볼륨과 함께 사용하면 방해나 차단으로 사운드를 변경해야 하는 모든 영역 및 장애물을 성공적으로 다룰 수 있습니다.
구현
Ak Geometry는 두 가지 주요 방법으로 구현할 수 있습니다. 한 방법은 AkGeometry 컴포넌트를 기존의 Static Mesh에 추가하는 것이고, 다른 방법은 AkSpatialAudioVolume 액터가 한 개 이상의 Static Mesh(혹은 다른 종류의 장애물)을 덮도록 하는 것입니다.
AkGeometry 컴포넌트를 Static Mesh에 추가하기
AkGeometry 컴포넌트를 기존의 Static Mesh에 추가하는 작업은 여러 단계로 구성됩니다. 먼저 Viewport에서 원하는 액터를 선택하고 (World Outliner에서 강조 표시됩니다) +Add Component 버튼을 클릭하여 AkGeometry 컴포넌트를 찾는 것입니다.
그림 30: Static Mesh에 AkGeometry 컴포넌트 추가하기
컴포넌트를 선택하고 Geometry 카테고리 안의 'Mesh Type' 매개 변수에 Simple Collision을 선택하며 'Enable Diffraction'을 활성화해야 합니다 (이미 활성화되지 않은 경우).
그림 31: AkGeometry 컴포넌트의 Details 탭
경우에 따라 이 솔루션은 컴포넌트에 의해 생성되는 지오메트리의 복잡성을 거의 제어할 수 없기 때문에 비용이 커질 수 있습니다. Complex보다 Simple 충돌을 사용하더라도 올바르게 작동하지 않을 경우 불필요하게 복잡해질 수 있기 때문에 주의해서 사용하세요. Static Mesh에 Simple Collision이 없을 경우 직접 생성하거나 테크 아트 팀에게 도움을 요청해야 합니다.
AkSpatialAudioVolume을 AkGeometry로서 사용하기
메시에 AkGeometry 컴포넌트를 사용하지 않으려는 경우 (보통 최적화의 이유로) 대신 AkSpatialAudioVolume을 사용할 수 있습니다. 이를 위해 볼륨의 액터 인스턴스를 레벨에 추가하고 메쉬를 올바르게 덮도록 모양을 만들어야 합니다. 볼륨의 Details 탭에서 'Enable Surface Reflectors'를 활성화하고 'Enable Late Reverb'와 'Enable Room'을 비활성화해야 합니다. 또한 'Enable Diffraction'이 활성화되었으며 SpatialAudioVolumeBlock 충돌 프리셋이 할당되었는지 확인해야 합니다.
그림 32: Static Mesh 주변으로 올바르게 배치 및 구성된 AkSpatialAudioVolume
SpatialAudioVolumeBlock 충돌 프리셋은 Custom Listener가 연결된 AudioTrace 채널에서 볼륨을 차단할 수 있도록 하기 때문에 특히 이러한 목적으로 사용됩니다. 이는 리스너가 경계 안으로 들어갈 염려 없이 더 짧은 시간에 더 간단한 AkGeometry 볼륨을 만들 수 있게 해줍니다. Custom Listener에 대한 더 많은 설명은 이 문서의 '맞춤 솔루션' 섹션을 봐주세요.
- 기존의 Room에서 Diffraction 활성화하기
기존의 Room이 사운드가 회절되는 오브젝트처럼 작동하도록 하려면 Details 탭의 Geometry Settings 카테고리에서 'Enable Diffraction'을 활성화해야 합니다.
그림 33: AkSpatialAudioVolume에서 Diffraction 활성화
이 작업은 완전히 볼록하지 않은 볼륨에서 볼륨이 안으로 구부러지는 가장자리 주변에 회절을 적용하고자 하는 활성화하기 위해 중요합니다.
그림 34: 활성화될 경우 사운드를 회절하는 가장자리가 선택된 오목한 AkSpatialAudioVolume
그림 35: 이미터(e) 와 리스너(l) 사이에 가능한 경로 중 하나
맞춤 솔루션
Scars Above에서는 사운드가 회절되어야 하는 수많은 벽과 계단 및 그 외 큰 물체가 많은 실외 공간이 있었습니다. 메시가 너무 많아서 여기에 AkGeometry 컴포넌트를 할당하는 것이 실용적이지 않았고 Brush Editing 도구를 사용하여 주변으로 AkSpatialAudioVolume을 형성하기에는 너무 시간이 많이 걸렸습니다. 이런 경우 프로그래머와 상의하여 빠르고 안정적인 Ak Geometry 생성에 대한 맞춤 솔루션을 생성하는 것이 좋습니다. 이 문서의 '맞춤 솔루션' 섹션에서 소개해드릴 SplineAudioWall이라는 도구를 고안하고 반복 작업하는 것이 참 재미있었습니다.
시험 / 문제 해결
Room 및 Portal과 마찬가지로 사운드가 지오메트리 주변으로 올바르게 회절하지 않거나 이미터나 리스너가 지오메트리 안으로 들어가지 않아야 하는데 그럴 경우 발생하는 문제에 대해 지오메트리를 시험하는 것이 필수적입니다. Unreal Editor와 Wwise 측 모두에서 회절을 시험하는 방법은 여러 가지가 있으며, 이 방법들은 문제가 되는 지오메트리를 찾아내는 데 도움이 되는 귀중한 정보를 제공하고 원하는 결과를 얻을 때까지 문제를 수정하고 매개 변수를 조정할 수 있는 기회를 제공합니다.
Unreal Editor 측면
- Draw Diffraction
게임 플레이 세션 도중 이미터의 회절 경로를 시험하기 위해 AkComponent의 Details 탭에서 Spatial Audio / Debug Draw 카테고리 아래 있는 Draw Diffraction을 활성화할 수 있습니다.
그림 36: AkComponent의 Draw Diffraction 디버그 그리기를 활성화함
시험하는 동안 게임 플레이 도중에 사운드가 재생되면 AkComponent가 담긴 이미터로부터 AkGeometry의 일부인 장애물 가장자리 주변으로 초록색 선이 그려집니다. 사운드가 회절되는 가장자리 지점에는 작은 보라색 구체가 표시됩니다. 이는 지오메트리의 경계가 적절히 설정되었는지, 지오메트리가 장애물을 충분히 덮고 있는지의 여부를 결정하는 데 도움을 줄 수 있습니다.
그림 37: 게임플레이 도중 회절 경로 그리기 예시
이 기능은 개발자만 사용할 수 있으며 빌드에서는 보이지 않지만 저장소에 변경 사항을 커밋하기 전에 AkComponent에서 Draw Diffraction 옵션을 비활성화하는 습관을 들이는 것이 좋습니다.
- Visualize Rooms and Portals(Room과 Portal 시각화하기)
또한 Visualize Rooms and Portals도 AkAcousticPortal 액터의 가장자리 주변으로 회절 경로를 시험하는 데 도움을 줄 수 있습니다. 위에서 언급한 Draw Diffraction과 함께 사용하면 포털 주변의 이미터로부터 리스너까지 그려지는 회절 경로를 볼 수 있습니다.
Wwise 측면
Wwise 측에서의 시험에서는 Authoring 도구의 두 가지 Profiler 레이아웃을 사용하여 직접 및 회절 경로 문제 해결에 필요한 정보 및 Diffraction과 Transmission Loss 매개 변수에 대한 정보를 얻는 것이 포함됩니다.
- Game Object Profiler
Game Object Profiler를 사용하면 현재 사운드를 재생하는 모든 이미터의 및 리스너의 위치와 Spatial Audio로 전달되는 지오메트리 및 사운드 전달과 회절에 대한 상호 영향을 그릴 수 있습니다. 그러기 위해서는 게임 세션을 시작하고 Authoring 도구에 연결해야 합니다. Game Object Profiler를 열면 (단축키 F12) 위에서 언급한 모든 오브젝트가 참조 평면에 표시될 것입니다. Game Object Profiler 사용하기에 대해서는 너무 깊게 다루지 않겠습니다. 이 도구는 지오메트리 및 Diffraction과 Transmission Loss의 경로 및 값을 포함한 Spatial Audio 구현을 시각적으로 측정하는 데 도움이 되는 아주 유용한 도구입니다.
그림 38: Game Object Profiler 내 프로파일링 세션 예시
- Voice Profiler
Voice Profiler는 Diffraction 및 Transmission Loss 매개 변수의 변경 사항을 보다 더 자세히 추적할 수 있게 해줍니다. 현재 사운드를 재생하는 각 Game Object에 대해 Voice Inspector에서 사운드의 전체 경로와 이에 적용되는 모든 처리를 볼 수 있습니다. 여기에는 Diffraction 및 Transmission Loss 매개 변수가 프로파일링하고자 하는 사운드를 재생하는 게임 오브젝트 참조의 하위 오브젝트로서 표시되는 것도 포함됩니다.
그림 39: Voice Profiler에서 보이는 Diffraction 및 Transmission Loss 매개 변수
최적화
Spatial Audio는 비용이 많이 들 수 있습니다. 계산에 포함되는 오브젝트 수, 지오메트리의 복잡성과 Spatial Audio에 요구하는 충실도의 수에 따라 매 틱에서 수행되는 계산이 오디오 스레드에 너무 부담이 될 수 있습니다. 늘 그렇듯 리소스는 제한되어 있기 때문에 신중한 사운드 디자이너라면 Spatial Audio 구현을 최적화하고 오디오 팀이 CPU에 가하는 부하량을 줄이기 위해 조치를 취할 것입니다.
다음은 제가 최적화 작업을 한 방식을 열거한 것입니다. 게임에서 잘 작동하는 Spatial Audio를 원하는 사운드 디자이너에게 도움이 되기를 바랍니다.
Room 연결을 통한 AkGeometry 최적화
AkGeometry 컴포넌트가 있는 액터가 Room 중 하나에 의해 완전히 덮여지는 경우 해당 컴포넌트를 Room과 연결시키는 것이 좋습니다. 그러면 해당 액터 주변의 소리 전달이 리스너가 장애물과 동일한 Room에 있을 경우에만 계산됩니다. 이 작업은 액터의 AkGeometry 컴포넌트를 선택하고 Optimization 카테고리에 있는 'Associated Room' 속성에서 올바른 Room 인스턴스를 할당하여 수행됩니다.
그림 40: Static Mesh의 AkGeometry 컴포넌트에 Room 연결하기
참고: 이것이 가능하려면 Room과 AkGeometry 컴포넌트가 있는 액터가 반드시 동일한 하위 레벨에 있어야 합니다.
Room이 지오메트리와 연결되었을 경우 해당 Room은 레벨에 있는 다른 전역적 지오메트리(어떤 Room과도 연결되지 않은 지오메트리)를 고려하지 않다는 점을 염두에 두세요.
완전히 볼록한 볼륨에서 Diffraction 비활성화하기
앞서 지오메트리로서 포함하고자 하는 모든 AkSpatialAudioVolume에 'Enable Diffraction'을 활성화해야 한다고 말씀드렸습니다. 모든 포털은 기본적으로 가장자리 주변의 사운드를 회절시키기 때문에 완전히 볼록한 모든 Room에서, 즉 사운드를 회절시키고자 하는 가장자리가 없는 볼륨에서는 이 옵션을 꺼두는 것이 안전합니다.
이러한 볼륨은 '공간의 모든 포털이 서로 직접적인 시선을 가지고 있는가'라는 질문을 하면 인식하기가 쉽습니다. 이에 대한 답이 '네'일 경우 지오메트리 계산에서 볼륨을 제외하는 것이 안전합니다.
바닥 표면 비활성화하기
Spatial Audio 지오메트리에 포함하려는 Room 볼륨이 있다고 가정해봅시다. 대부분의 Room은 벽, 천장, 바닥으로 구성되어 있습니다. 이런 공간에서는 바닥(예: 아랫쪽 표면)에서의 회절을 계산할 필요가 거의 없으므로 AkGeometry 계산에서 해당 표면을 제외하는 것이 안전합니다. 이렇게 하면 AkGeometry 삼각형의 수가 줄어들고 볼륨 아래에서 회절 경로를 계산할 필요가 없어집니다.
이 작업은 Brush Editing 모드를 시작하고 볼륨의 특정 바닥 표면을 선택한 후 Geometry Surfaces 카테고리의 'Enable Surface' 속성 옆에 있는 상자를 선택 해제하여 수행됩니다.
그림 41: Room 볼륨에서 바닥 표면 비활성화
오래된 포털 제거하기
Room과 Portal로 레벨을 구성하고 모든 것이 올바르게 작동하는 것을 확인한 후에는 추가한 일부 포털이 게임플레이 도중 사실상 사운드가 전혀 통과하지 않는지 자문해봐야 합니다. 레벨 디자이너가 미적인 이유로 빛이 들어오도록 벽이나 천장에 (혹은 심지어 바닥) 개구부를 뚫어놓았을 수 있습니다. 이러한 개구부마다 전용 포털을 두면 지오메트리가 게임의 지오메트리를 충실히 모방하고 반대편에서 소리가 들릴 경우 이를 들을 수 있음을 보장할 수 있습니다.
일부 포털에서는 반면 반대편에서 사운드가 전혀 방사되지 않는 상황이 있을 수 있습니다. 그러한 포털을 제거하면 Spatial Audio 구현이 크게 향상됩니다 각 포털마다 이미터, 리스너, 그리고 Room에 연결된 다른 모든 포털에 대해 경로가 계산되어야 하기 때문입니다.
더 간단한 지오메트리 만들기
당연하게 들릴 수 있지만 지오메트리가 더 단순할수록 해야 할 계산이 줄어들고 CPU가 더 원활히 실행됩니다. 지오메트리 단순화를 고려할 때 게임의 모든 실제 사례와 특정 상황에서 달성하려는 세부 수준을 고려하세요. 구부러진 기둥 주위로 세심하게 형성된 볼륨이 더 높은 세부성을 제공할 수 있지만 실제로 플레이어가 그 정도의 충실도를 인식할 수 없는 경우 게임에 포함할 필요가 없기 때문에, 더 간단한 모양으로 동일한 결과를 얻을 수 있는지 스스로 생각해봐야 합니다.
이러한 경우 새로운 볼륨을 생성하거나 유지하려는 정점을 선택하고 더 이상 사용하지 않는 정점을 용접하여 기존 볼륨의 삼각형 수를 줄일 수 있습니다.
플랫폼별 Spatial Audio 설정
오디오 스레드가 여전히 모든 Spatial Audio 작업을 처리하는 데 어려움을 겪고 있다면 플랫폼의 Spatial Audio Initialization Settings를 확인하여 Wwise 통합 측에서 개선할 수 있는 부분이 있는지 살펴봐야 합니다. 이 설정은 Wwise Project Settings 카테고리의 일부이며 어느 정도의 충실도를 희생하여 CPU 부담을 줄일 수 있는 많은 매개 변수가 제공됩니다. 이를 별도로 다루지는 않겠지만, 대부분의 매개 변수는 스스로 이해하기에 충분하며 나머지는 툴팁이나 문서에서 설명되어 있습니다.
아래는 PS4와 PS5 플랫폼에서 각각 만족스러웠던 설정입니다.
그림 42: Scars Above의 PS4 플랫폼에 대한 Spatial Audio Settings
그림 43: Scars Above의 PS5 플랫폼에 대한 Spatial Audio Settings
월드 구성 문제
작업하는 레벨이 World Composition의 일부이고 다른 레벨과 함께 스트리밍되는 경우 Spatial Audio 액터를 호스트하기 위해 특별히 만들어진 영구 하위 레벨에 모든 Spatial Audio 액터를 배치하는 것이 좋습니다 (예: SUB_Sound_SpatialAudio). 그 이유는 Wwise 버전 2021.1.9와 Unreal Engine 버전 4.27.2에서 Spatial Audio 액터가 쉽게 스트리밍되지 않기 때문이다. 다시 말해 대량의 Room과 Portal 및 기타 Ak 지오메트리를 런타임 때 동시에 로드/언로드는 경우 사운드가 끊기거나 프레임 드롭 문제가 생길 수 있습니다. 모든 Spatial Audio 액터를 영구 하위 레벨에 두면 리소스를 많이 사용하지 않고 이 문제를 피할 수 있습니다 (올바르게 구성할 경우 동시에 수많은 Spatial Audio 지오메트리를 로딩하는 것은 아무 문제를 일으키지 않습니다). Scars Above에서는 한 영구 레벨에 천 개가 넘는 액터가 있었고 게임이 아무 문제 없이 실행되었습니다.
맞춤 솔루션
Audiokinetic에서 Spatial Audio API의 일부로 제공하는 도구는 게임의 음향적 공간을 제작 및 시험하는 데 필요한 대부분의 요구 사항을 충족시켜 줍니다. 하지만 프로젝트마다 특별한 점이 있기 때문에 프로그래밍 팀의 도움을 받아 몇몇 맞춤 솔루션을 제작하여 Spatial Audio 파이프라인을 업그레이드해야 할 필요성을 느꼈습니다. 이러한 솔루션은 효율성과 속도 측면에서 작업 과정을 개선해주었습니다. 오직 맞춤형 솔루션이 제공할 수 있는 가능성을 달성하려면 사용 가능한 도구 세트를 더 알아보고 주변 사람들과 더 많이 대화해보는 것을 적극 권장합니다.
Custom Listener(사용자 정의 리스너)
리스너 기능은 Wwise Unreal 통합에서 이어받았지만 어느 정도 확장을 통해 더욱 유연하게 만들었습니다. Custom Listener는 카메라에 연결되어 있지만 별도로 움직일 수 있는 전용 스프링 암에 설정되어 있습니다. 카메라의 위치는 카메라와 Player Character 사이의 어떤 지점으로든 설정할 수 있습니다 (Player Character에서의 경로부터 2/3 정도에 위치하는 것이 게임에서 가장 자연스러운 위치로 느껴졌습니다). 컷씬 도중에 카메라가 멀리 이동할 경우 리스너도 같이 따라서 이동하거나 Player Character와 같은 위치에 두도록 선택할 수 있습니다.
Spatial Audio와의 관계에 있어서는 리스너가 SpatialAudioVolumeBlock 충돌 프리셋이 설정된 지오메트리 안에 절대 접근할 수 없도록 만들었습니다. 카메라와 리스너가 별도의 스프링 암에 있기 때문에 카메라를 가리지 않는 Ak Geometry(예: 보이지 않는 볼륨)는 리스너를 가리게 됩니다. 이는 리스너가 절대 지오메트리에 의해 차단되지 않도록 하는 안전 장치 역할을 합니다. 또한 장애물 주변으로 보다 덜 복잡한 지오메트리를 만들 수 있는 가능성도 제공해줍니다.
- ShowDebug AudioListener 명령어
ShowDebug AudioListener는 런타임 때 업데이트되는 Custom Listener 컴포넌트의 현재 위치를 파란색 구체 형태로 표시하는 디버깅용 콘솔 명령어입니다. 이 명령어는 스프링 암에서 리스너의 위치를 확인하는 데 도움이 됩니다. 또한 리스너가 볼륨 경계를 벗어나거나 바람직하지 않은 방식으로 방해되는 경우 이를 알려줄 수 있습니다. 그리고 리스너의 현재 트랜스폼 데이터도 출력해줍니다.
GIF 7: ShowDebug AudioListener 콘솔 명령어로 리스너 디버깅하기
VisualizeAkGeometry
Visualize Rooms and Portals를 사용할 수 있다는 것은 훌륭하지만 포털과 볼륨으로의 연결뿐만 아니라 게임플레이 도중 모든 AkGeometry를 시각화할 수 있다면 더 좋지 않을까요?
이 작업을 VisualizeAkGeometry라는 디버깅 도구로 성취하려고 했습니다. 이 도구를 활성화하면 볼륨과 레벨 상의 다른 지오메트리와의 관계를 눈으로 확인할 수 있어서 문제 지점을 훨씬 쉽게 찾고 실제 게임을 플레이하는 동안 리스너와 이미터의 경로를 디버깅할 수 있습니다.
저희는 여기에 몇 가지 다른 뷰를 구현했습니다. 도구를 토글할 수 있을 뿐만 아니라 지오메트리를 반투명한 메시, 와이어프레임, 혹은 둘 다 사용하여 표시하도록 할 수도 있고 두 가지 다른 뷰 깊이 중에서 선택할 수도 있습니다. 첫 번째 깊이는 다른 모든 레벨 액터 앞에 모든 Ak Geometry를 표시하여 볼륨의 전체 모양을 보여주는 반면, 두 번째 깊이는 다른 레벨 지오메트리 뒤에 있는 지오메트리를 숨겨서 Brush Editing 세션 도중 찾지 못한 튀어나온 자리나 면이 있지 않았는지 확인할 수 있게 해줍니다. 또한 이 뷰는 포털이 있어야 하는 개구부의 볼륨 면을 볼 수 있어서 리스너나 이미터가 한 영역에서 다른 영역으로 교차하는 위치를 정확히 찾아낼 수 있습니다.
GIF 8: 여러 다른 VisualizeAkGeometry 표시 모드
SplineAudioWalls
장애물 주변으로 Ak Geometry를 더 빠르고 간편하게 생성하기 위해 스플라인 액터의 지점을 추가 및 제거하는 유연성 및 속도를 제공하는 액터 클래스를 구현했습니다. 또한 이 액터 클래스는 각 지점에 대해 간단한 메시를 빠르게 생성하고 변경할 수 있게 해줍니다.
이로 인해 기존의 레벨 지오메트리 주변으로 볼륨을 형성해야 할 경우 다소 번거로울 수 있는 Brush Editing 도구에 의존하지 않고 Ak Geometry를 생성할 수 있게 되었습니다. SplineAudioWall 접근 방식은 훨씬 직관적이며, 주요 목적이 벽을 시뮬레이션하는 것이지만 모든 종류의 모양을 포함할 수 있기 때문에 Ak Geometry에 대해 Brush Editing 보다 더 선호하는 작업 과정이 되었습니다.
레벨에 액터를 배치하면 지오메트리의 기초 역할을 할 짧은 스플라인과 간단한 보라색 상자가 표시됩니다. 스플라인에는 새로운 지점을 자유롭게 추가할 수 있으며, 그러면 새로운 상자(절차적 메시)가 즉시 생성됩니다. 각 개별 지점에 대해 절차적 메시를 이동 및 회전할 수 있을 뿐만 아니라 모든 방향으로 크기를 조정할 수도 있습니다.
액터 작업이 끝나고 나면 (스플라인의 개수에 따라) 몇 개의 간단한 상자로 만들어진 한 개의 복잡한 모양이 만들어집니다. 그런 다음 이 절차적 메시는 Static Mesh로 베이킹되어 AkGeometry 컴포넌트가 연결되어서 Wwise Spatial Audio 엔진으로 지오메트리를 전송하게 됩니다. 베이킹된 메시는 기본적으로 SpatialAudioVolumeBlock 충돌 프리셋이 할당되어 있어서 리스너가 경계선 안에 들어가지 못하도록 막아줍니다.
저희가 액터에 추가한 한 가지 멋진 기능은 최적화를 위해 모든 바닥 표면을 끌 수 있는 기능입니다. 이러한 이러한 액터는 보통 레벨의 바닥에 배치되기 때문에 해당 옵션이 기본적으로 활성화되어 있습니다.
GIF 9: SplineAudioWall 액터의 인스턴스 변경하기
또한 이러한 액터는 VisualizeAkGeometry 디버깅 도구를 통해 표시될 수 있습니다. AkSpatialAudioVolume은 연한 파란색으로 표시되며 SplineAudioWall은 보라색으료 표시됩니다 (GIF 8 참고).
각각의 새로은 스플라인 지점은 Spatial Audio로 전송되는 지오메트리에 삼각형을 추가하기 때문에 불필요한 지점은 반드시 삭제하세요.
이 솔루션의 향후 개선 사항은 아마 Transmission Loss 매개 변수와 표면 당 Acoustic Texture를 추가하는 것일 겁니다. Scars Above에서는 Wwise Reflect를 사용하지 않았기 때문에 이를 우선시하지 않았습니다.
무기 꼬리음 전환
Scars Above에서는 기존의 Room 네트워크를 사용하여 Interior/Exterior 유형 및 크기에 따라 Player Character가 있는 공간의 유형을 결정하기로 했습니다.
저희는 AudioTrace 채널을 사용하여 일정한 간격으로 볼륨을 추적하고 우선 순위가 가장 높은 볼륨의 액터 태그를 반환하는 커스텀 Player Character 컴포넌트를 생성하여 이를 달성했습니다. 반환되는 액터 태그에 따라 알맞은 Interior/Exterior 상태를 Wwise에서 설정합니다. 이 상태는 Weapon Tail 전환을 포함한 다양한 작업에 사용됩니다. 저희의 경우 Exterior, Interior_Large, Interior_Medium, Interior_Small라는 네 가지 유형의 Weapon Tail 사운드로 충분하다고 결정했습니다. 액터 태그는 각 AkSpatialAudioVolume 인스턴스에 직접 추가되어야 합니다.
그림 44: V.E.R.A의 General Settings 탭. 무기 꼬리음 스위치 컨테이너
마치는 말
글을 읽어주셔서 감사합니다. 여기서 소개해드린 조언이 Spatial Audio에 관한 어려움을 좀 더 쉽게 처리할 수 있기를 바랍니다. Spatial Audio API는 Audiokinetic의 개발자들에 의해 지속적으로 개선되고 있기 때문에 이 글의 일부 상세 정보는 시간이 지나면서 관련성이 떨어지겠지만, 좋은 계획과 구성, 신중한 구현, 철저한 문제 해결 및 최적화의 일반 원칙은 계속해서 크게 적용될 것입니다. 저는 앞으로도 Spatial Audio의 개발을 면밀히 관찰할 것이기 때문에 이 글도 새로운 발견과 더 나은 사례로 업데이트되기를 바랍니다.
지원과 피드백을 주신 Mad Head Games(매드 헤드 게임즈)의 동료 사운드 디자이너인 디미트리제(Dimitrije), 셀레나(Selena), 테오도라(Teodora), 마르코(Marko)와 EA Dice(EA 다이스)의 니콜라(Nikola)에게 큰 존경을 표합니다. Mad Head Games 프로그래밍 팀의 니나(Nina), 스테반(Stevan), 네만자(Nemanja), 두샨(Dušan)에게도 큰 감사를 표합니다. 많은 조언을 해주시고 이 블로그로 제 생각을 출판할 기회를 주신 Audiokinetic 의 줄리(Julie), 아드리앙(Adrien), 기욤(Guillaume), 네이슨(Nathan), 루이-자비에(Louis-Xavier), 탈리(Thalie), 마샤(Masha), 막시밀리앙(Maximilien)에게도 크게 감사드립니다.
댓글