언리얼 엔진 5의 오디오 기능은 오디오 요구 사항이 다양한 프로젝트를 지원할 수 있습니다. 오디오는 콘텐츠 폴더로 이동하여 임포트(Import) 버튼을 클릭하거나 OS 탐색기에서 해당 폴더로 이동하여 임포트할 수 있습니다. 그러면 엔진은 사운드가 포함된 .uasset 파일을 생성합니다. 언리얼 엔진은 .wav, .ogg, .flac, .aif, .opus, .mp3 파일을 지원합니다. 파일의 비트 뎁스는 16 또는 24여야 하며 샘플 레이트는 제한이 없습니다. 언리얼 엔진 내부적으로는 임포트된 오디오 파일을 16비트 비압축 .wav 포맷으로 저장합니다.
언리얼 엔진의 오디오 엔진에 대한 자세한 내용은 다음 문서를 참조하세요.
사운드 큐는 런타임에 사운드를 재생하는 데 사용되는 오브젝트입니다. 사운드 큐는 동일한 개념을 나타내는 오디오 파일 세트 중에서 사운드를 선택합니다. 예를 들어, '바람'에 대한 사운드 큐가 있다면, 런타임에 이 사운드 큐는 여러 개의 바람 소리 오디오 파일 중에서 선택하여 사운드를 재생합니다. 패럿에서는 물이 튀는 사운드 큐를 예로 들 수 있습니다. Content/Sound/SFX/WaterSplash/CUE_WaterSplashSound
사운드 클래스는 오디오 엔진이 여러 사운드를 함께 그룹화한 다음, 관련된 모든 사운드 웨이브의 파라미터를 동시에 변경하는 데 사용하는 에셋 타입입니다. 패럿에는 Music과 SFX를 모두 믹싱하는 MainSoundClass가 있습니다.
사운드 클래스 믹스는 볼륨 한계치를 적용할 수 있으며, 사운드 클래스의 사운드가 재생될 때마다 자동으로 적용됩니다.
패럿 전용 구현
패럿에서 사용되는 대부분의 사운드는 하나의 사운드를 포함하는 사운드 큐입니다. 볼륨과 피치는 사운드 큐별로 설정되며 전체 볼륨은 디폴트 사운드 클래스와 사운드 믹스 세팅을 통해 제어됩니다. 음악에서 이를 간소화하기 위해 패럿에는 커스텀 오디오 서브시스템이 있습니다.
픽업 예시
픽업은 한 번 재생된 후 소멸되는 단순한 사운드 큐의 예입니다. 픽업은 opengameart.org의 코인 사운드 이펙트를 사용합니다. 임포트한 소스 에셋은 Content/Assets/OpenGameArt/8bitCoinSounds에 있습니다. 이러한 각 파일에 대해 생성된 사운드 큐는 Content/Sound/SFX/Pickups 아래에 있습니다. 픽업 이벤트가 시작되면 BP_PickupBase에서 원하는 사운드 큐를 사용하여 Play Sound 2D를 호출합니다.
모든 픽업은 VFX, SFX를 지원하며 접촉 시 소멸되어야 합니다. 이 작업은 BP_PickupBase 클래스에서 처리될 수 있습니다.
여기서는 Play Sound 2D를 사용할 수 있는데, 이 사운드는 월드와 공간적으로 관련될 필요가 없기 때문입니다. 사운드가 공간적으로 관련되어야 한다면, 대신 Play Sound At Location을 사용할 수 있습니다.
음악 루프
음악은 표준 사운드 큐와 매우 유사하게 작동합니다. 사운드 파일을 임포트하고 사운드 큐를 구성하는 것은 사운드 이펙트와 동일합니다. 하지만, 몇 가지 추가적인 단계를 수행해야 합니다.
임포트한 사운드 에셋 자체에서 가상화 모드가 무음일 때 플레이(Play When Silent)로 설정되어 있는지 확인합니다. 이 설정은 플레이어가 볼륨 세팅을 따를 수 있게 해주므로 음악에 있어 중요합니다. 이 설정이 없으면 볼륨이 음소거되었을 때 사운드가 소멸되어 볼륨을 복원해도 더는 재생되지 않습니다.
사운드 큐 자체에서 트랙 노드를 클릭하고 루핑(Looping)이 설정되어 있는지 확인합니다.
사운드 세팅
패럿의 모든 세팅은 다양한 사운드 볼륨과 관련되어 있습니다.
Content/Sound/Settings 아래에는 MainSoundClass라는 사운드 클래스 에셋이 있습니다. 자손 클래스(Child Classes) 아래에서 사운드 클래스를 다른 관련 사운드 클래스로 지정할 수 있습니다. 디폴트 자손 클래스에는 SFX 및 Music이 포함되어 있습니다.
같은 폴더에 DefaultSoundMix라는 에셋이 있습니다. MainSoundClass 세팅에서 사운드 클래스 이펙트(Sound Class Effects)를 설정할 수 있습니다. 자손에 적용(Apply To Children)이 활성화되어 있는지 확인합니다.
각 사운드 큐에서 클래스가 적절한 카테고리로 설정되어 있는지 확인합니다. 픽업의 경우 SFX 클래스를 사용합니다.
런타임에 믹스의 세팅을 수정하려면 Set Sound Class Mix Override 노드와 Push Sound Mix Modifier 노드를 함께 사용하면 됩니다. 이를 통해 변경사항이 적용됩니다.
이는 블루프린트 예시이지만, 패럿에서는 보통 C++로 구현된 오디오 서브시스템에서 처리됩니다.
패럿 오디오 서브시스템
이 섹션에서는 오디오 서브시스템 구현이 하는 일을 설명합니다. 패럿에 오디오용 서브시스템이 있는 이유에 대해서는 패럿의 서브시스템을 참조하세요.
패럿 오디오 서브시스템은 UParrotAudioSubsystem이라는 C++ 클래스입니다. 이 클래스는 게임 인스턴스의 수명을 공유하는데, 메인 메뉴나 일시정지 메뉴에서 볼륨 세팅이 언제든지 변경될 수 있기 때문입니다. 플레이가 진행 중일 때 오디오 서브시스템은 게임 스테이트 변경도 수신합니다. 그러면 레벨이 시작되거나 레벨이 완료될 때, 아니면 플레이어가 경계를 벗어날 때 음악 트랙을 변경할 수 있습니다.
WBP_SettingScreen은 오디오 서브시스템이 실제로 작동하는 모습을 보여줍니다. UMG(언리얼 모션 그래픽 UI 디자이너)의 슬라이더 값은 C++ 서브시스템에 전달됩니다. 런타임 사운드 믹서는 이 값이 변경될 때마다 업데이트됩니다. 볼륨 변경이 즉시 적용되도록 Fade In 시간은 0으로 설정합니다.
세팅은 Save Audio Settings 노드를 통해 저장됩니다.
이러한 세팅을 저장하기 위해 시리얼라이제이션이 작동하는 방식에 대한 자세한 내용은 패럿의 시리얼라이제이션을 참조하세요.
패럿의 음악은 거의 전적으로 C++로 구현되어 있습니다. 패럿은 각 맵이 레벨인 구조를 가지고 있기 때문에 AParrotWorldSettings 클래스가 존재합니다. 이 클래스를 사용하여 레벨 음악과 같은 월드별 데이터를 설정할 수 있습니다. 오디오 서브시스템은 월드 세팅을 쿼리하여 필요한 트랙을 가져옵니다. 게임이 시작된 후 스테이트 변화에 반응하려면 WorldBeginPlay에서 패럿 게임 스테이트에 바인딩합니다.