UE5 MetaSound — 프로그래머블 오디오 시스템
MetaSound는 UE5의 차세대 오디오 시스템으로 DSP 그래프를 C++ 또는 에디터에서 직접 구성합니다. SoundCue와 달리 완전한 프로그래머블 신호 처리 파이프라인을 제공해 절차적 음악, 적응형 사운드, 다이나믹 믹싱을 구현할 수 있습니다.
1. MetaSound 에셋 생성
섹션 제목: “1. MetaSound 에셋 생성”Content Browser > 우클릭 > Sounds > MetaSound Source또는 MetaSound Patch (재사용 가능한 서브그래프)
에디터 구성:- Input 노드: 외부에서 주입할 파라미터- Output 노드: 최종 오디오 출력- DSP 노드: 필터, 엔벨로프, 믹서 등2. C++에서 MetaSound 재생
섹션 제목: “2. C++에서 MetaSound 재생”#include "MetasoundSource.h"#include "Components/AudioComponent.h"
UCLASS()class AWeapon : public AActor{ GENERATED_BODY()
UPROPERTY(EditAnywhere, Category="Audio") UMetaSoundSource* FireSound;
UPROPERTY(VisibleAnywhere) UAudioComponent* AudioComp;
public: void Fire() { // MetaSound 재생 AudioComp->SetSound(FireSound); AudioComp->Play();
// 파라미터 전달 (MetaSound Input 노드와 매칭) AudioComp->SetFloatParameter( FName("Charge"), // Input 노드 이름 ChargeLevel); // 0.0 ~ 1.0
AudioComp->SetBoolParameter( FName("IsSuppressed"), bIsSuppressed); }
void OnHeatChanged(float NewHeat) { // 런타임 파라미터 업데이트 (재생 중에도 가능) AudioComp->SetFloatParameter(FName("HeatLevel"), NewHeat); }};3. MetaSound 파라미터 시스템
섹션 제목: “3. MetaSound 파라미터 시스템”// 더 정밀한 파라미터 제어: MetaSoundParameterTransmitter#include "MetasoundParameterTransmitter.h"
UCLASS()class AAmbienceManager : public AActor{ GENERATED_BODY()
TSharedPtr<Audio::FMetasoundParameterTransmitter> _transmitter; UAudioComponent* _audioComp;
public: void Initialize() { if (UMetaSoundSource* MetaSound = Cast<UMetaSoundSource>( _audioComp->GetSound())) { // Transmitter 획득 _transmitter = MetaSound->CreateParameterTransmitter( _audioComp->GetAudioComponentID()); } }
void SetWindIntensity(float Value) { if (_transmitter) { // 타입 안전 파라미터 전송 _transmitter->SetParameter( Audio::FMetasoundParameterTransmitter::FParam{ FName("WindIntensity"), Value }); } }
void TriggerLightningStrike() { if (_transmitter) { // 트리거 신호 (bool 펄스) _transmitter->SendTrigger(FName("LightningTrigger")); } }};4. 절차적 음악 구현
섹션 제목: “4. 절차적 음악 구현”MetaSound Graph 구성 예 (적응형 전투 음악):
[Float Input: CombatIntensity] → [Lerp] ↘[Wave Table Osc: CalmMelody] ──────→ [Mix] → [EQ] → [Output][Wave Table Osc: IntenseMelody] ───→ [Mix] ↗[Float Input: CombatIntensity] → [1-x]
파라미터:- CombatIntensity: 0=평화, 1=전투- 블렌딩은 MetaSound의 실시간 DSP로 부드럽게 처리// C++에서 전투 강도 업데이트void AGameMode::UpdateMusicIntensity(float DeltaTime){ int32 NearbyEnemies = CountNearbyEnemies(Player, 1000.f); float TargetIntensity = FMath::Clamp(NearbyEnemies / 5.f, 0.f, 1.f);
CombatIntensity = FMath::FInterpTo( CombatIntensity, TargetIntensity, DeltaTime, 2.f);
MusicComp->SetFloatParameter(FName("CombatIntensity"), CombatIntensity);}5. 커스텀 MetaSound 노드 — C++
섹션 제목: “5. 커스텀 MetaSound 노드 — C++”// 커스텀 DSP 노드 등록#include "MetasoundNode.h"#include "MetasoundDataTypeRegistrationMacro.h"
// 간단한 사인파 노드class FSineOscNode : public Metasound::FNode{public: static const Metasound::FNodeClassMetadata& GetNodeInfo() { auto InitInfo = []() -> Metasound::FNodeClassMetadata { Metasound::FNodeClassMetadata Info; Info.ClassName = { "MyPlugin", "SineOscillator", "" }; Info.MajorVersion = 1; Info.MinorVersion = 0; Info.DisplayName = NSLOCTEXT("MetaSound", "SineOsc", "Sine Oscillator"); Info.CategoryHierarchy = { NSLOCTEXT("MetaSound", "DSP", "DSP") }; return Info; };
static Metasound::FNodeClassMetadata Info = InitInfo(); return Info; }
// 입력/출력 핀 정의 및 Process() 구현 // (실제 구현은 TExecutableOperator 상속 필요)};
// 노드 등록 매크로METASOUND_REGISTER_NODE(FSineOscNode);6. SoundCue vs MetaSound
섹션 제목: “6. SoundCue vs MetaSound”| 항목 | SoundCue | MetaSound |
|---|---|---|
| 신호 처리 | 제한적 | 완전한 DSP |
| 절차적 오디오 | 불가 | 가능 |
| 파라미터 | 제한적 | 임의 타입 |
| 성능 | 낮음 | 높음 (DSP 스레드) |
| 커스텀 노드 | 불가 | C++ 확장 가능 |
| Blueprint 지원 | 완전 | 제한적 |
MetaSound는 UAudioComponent::SetFloatParameter로 런타임에 DSP 파라미터를 실시간 조정할 수 있어 SoundCue로는 불가능한 적응형 오디오를 구현합니다. 전투 강도, 환경 파라미터를 게임플레이 상태와 연동하고, MetaSound Patch로 공통 DSP 블록(리버브, 이퀄라이저)을 재사용하면 일관된 오디오 품질을 유지할 수 있습니다.