콘텐츠로 이동

UE5 MetaSound — 프로그래머블 오디오 시스템

MetaSound는 UE5의 차세대 오디오 시스템으로 DSP 그래프를 C++ 또는 에디터에서 직접 구성합니다. SoundCue와 달리 완전한 프로그래머블 신호 처리 파이프라인을 제공해 절차적 음악, 적응형 사운드, 다이나믹 믹싱을 구현할 수 있습니다.


Content Browser > 우클릭 > Sounds > MetaSound Source
또는 MetaSound Patch (재사용 가능한 서브그래프)
에디터 구성:
- Input 노드: 외부에서 주입할 파라미터
- Output 노드: 최종 오디오 출력
- DSP 노드: 필터, 엔벨로프, 믹서 등

#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);
}
};

// 더 정밀한 파라미터 제어: 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"));
}
}
};

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);
}

// 커스텀 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);

항목SoundCueMetaSound
신호 처리제한적완전한 DSP
절차적 오디오불가가능
파라미터제한적임의 타입
성능낮음높음 (DSP 스레드)
커스텀 노드불가C++ 확장 가능
Blueprint 지원완전제한적

MetaSound는 UAudioComponent::SetFloatParameter로 런타임에 DSP 파라미터를 실시간 조정할 수 있어 SoundCue로는 불가능한 적응형 오디오를 구현합니다. 전투 강도, 환경 파라미터를 게임플레이 상태와 연동하고, MetaSound Patch로 공통 DSP 블록(리버브, 이퀄라이저)을 재사용하면 일관된 오디오 품질을 유지할 수 있습니다.