/ue-audio-system
Use this skill when working with audio, sound, music, UAudioComponent, PlaySoundAtLocation, SoundCue, MetaSound, attenuation, submix, concurrency, SFX, or spatial audio in Unreal Engine. See references/audio-setup-patterns.md for music system and ambient soundscape
$ npx -y skills add quodsoler/unreal-engine-skills --skill ue-audio-system --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/ue-audio-system
Context preview
The summary Claude sees to decide when to auto-load this skill.
Use this skill when working with audio, sound, music, UAudioComponent, PlaySoundAtLocation, SoundCue, MetaSound, attenuation, submix, concurrency, SFX, or spatial audio in Unreal Engine. See references/audio-setup-patterns.md for music system and ambient soundscape
SKILL.md
ue-audio-system.SKILL.mdname: ue-audio-system
description: "Use this skill when working with audio, sound, music, UAudioComponent, PlaySoundAtLocation, SoundCue, MetaSound, attenuation, submix, concurrency, SFX, or spatial audio in Unreal Engine. See references/audio-setup-patterns.md for music system and ambient soundscape architectures. For VFX audio synchronization, see ue-niagara-effects."
metadata:
version: 1.0.0
UE Audio System
You are an expert in Unreal Engine's audio systems, covering UAudioComponent, sound asset types, spatial attenuation, concurrency management, submix routing, MetaSounds, and runtime audio analysis.
Context Check
Before implementing audio, read `.agents/ue-project-context.md` for:
- **Audio plugins** enabled (Resonance Audio, Steam Audio, Wwise, FMOD, MetaSound plugin version)
- **Target platforms** — mobile has strict voice limits; consoles differ from PC
- **Dedicated server** flag — audio must be skipped server-side or it will crash/log errors
- **VR flag** — VR projects require binaural spatialization settings
Information Gathering
Ask about:
1. One-shot SFX, looping ambient, music, UI feedback, or dialogue? 2. Spatialized (follows actor) or global 2D? 3. Concurrency concern (gunshots, footsteps, explosions)? 4. Runtime control needed (fade, pause, parameter changes)? 5. MetaSound procedural or pre-authored SoundCue/SoundWave?
---
Sound Asset Hierarchy
USoundBase // abstract base (SoundBase.h)
├── USoundWave // raw PCM/compressed audio asset
├── USoundCue // node-graph: random, modulator, mixer, attenuator nodes
└── UMetaSoundSource // procedural audio graph (MetaSound plugin)
**USoundWave** — Import .wav/.ogg/.flac. Set `SoundClassObject` and `AttenuationSettings` on asset.
**USoundCue** — Node graph combining multiple waves. Key nodes: `USoundNodeRandom`, `USoundNodeModulator`, `USoundNodeMixer`, `USoundNodeAttenuation`, `USoundNodeLooping`, `USoundNodeDelay`, `USoundNodeDistanceCrossFade`.
**UMetaSoundSource** — Procedural audio graph. Declare typed inputs (float, bool, int32, trigger). Set parameters at runtime via `UAudioComponent::SetFloatParameter`, `SetBoolParameter`, `SetIntParameter`.
Streaming Long Audio
For music and ambient tracks exceeding ~30 seconds, set `USoundWave::LoadingBehavior`: `ESoundWaveLoadingBehavior::ForceInline` for short SFX, `RetainOnLoad` for music loaded at level start. Long files should use `LoadOnDemand` to avoid loading the full waveform into memory. In the editor: SoundWave asset → Details → Loading → Loading Behavior.
---
Playing Sounds from C++
Fire-and-Forget
#include "Kismet/GameplayStatics.h"
// 2D — not spatialized (UI, music)
UGameplayStatics::PlaySound2D(
this, ImpactSound, 1.0f /*Vol*/, 1.0f /*Pitch*/, 0.0f /*StartTime*/,
ConcurrencySettings, OwningActor
);
// 3D — spatialized, requires AttenuationSettings on the sound asset
UGameplayStatics::PlaySoundAtLocation(
this, GunShotSound, GetActorLocation(), FRotator::ZeroRotator,
1.0f, 1.0f, 0.0f,
AttenuationOverride, // USoundAttenuation* (nullptr = use asset default)
ConcurrencyOverride, // USoundConcurrency* (nullptr = use asset default)
this // OwningActor for per-owner concurrency
);Spawn with Handle
// Returns UAudioComponent* — auto-destroyed when sound finishes if bAutoDestroy=true
UAudioComponent* Comp = UGameplayStatics::SpawnSoundAtLocation(
this, ExplosionSound, Location, FRotator::ZeroRotator,
1.0f, 1.0f, 0.0f, AttenuationSettings, nullptr, /*bAutoDestroy=*/true
);
// Attach to a moving component (vehicle engine)
UAudioComponent* EngineAudio = UGameplayStatics::SpawnSoundAttached(
EngineLoopSound, GetMesh(), NAME_None,
FVector::ZeroVector, FRotator::ZeroRotator,
EAttachLocation::SnapToTargetIncludingScale,
/*bStopWhenAttachedToDestroyed=*/true,
1.0f, 1.0f, 0.0f, AttenuationSettings, nullptr,
/*bAutoDestroy=*/false // keep alive for looping
);UAudioComponent as Permanent Actor Component
// In constructor:
AudioComponent = CreateDefaultSubobject<UAudioComponent>(TEXT("AudioComponent"));
AudioComponent->SetupAttachment(RootComponent);
AudioComponent->bAutoActivate = false;
AudioComponent->bStopWhenOwnerDestroyed = true;Playback Control
AudioComponent->SetSound(EngineLoopSound);
AudioComponent->Play(/*StartTime=*/0.0f);
AudioComponent->Stop();
AudioComponent->SetPaused(true);
AudioComponent->FadeIn(0.5f, 1.0f, 0.0f, EAudioFaderCurve::Linear);
AudioComponent->FadeOut(1.0f, 0.0f, EAudioFaderCurve::Linear);
AudioComponent->SetVolumeMultiplier(0.5f);
AudioComponent->SetPitchMultiplier(1.2f);
// Query play state (EAudioComponentPlayState: Playing, Stopped, Paused, FadingIn, FadingOut)
EAudioComponentPlayState State = AudioComponent->GetPlayState();
Delegates (AudioComponent.h)
// Declared in AudioComponent.h:
// DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnAudioFinished)
// DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnAudioPlaybackPercent, const USoundWave*, PlayingSoundWave, const float, PlaybackPercent)
// DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnAudioPlayStateChanged, EAudioComponentPlayState, PlayState)
AudioComponent->OnAudioFinished.AddDynamic(this, &AMyActor::OnSoundFinished);
AudioComponent->OnAudioPlaybackPercent.AddDynamic(this, &AMyActor::OnPlaybackPercent);
AudioComponent->OnAudioPlayStateChanged.AddDynamic(this, &AMyActor::OnPlayStateChanged);
// Native (non-UObject) binding — no GC overhead:
// DECLARE_MULTICAST_DELEGATE_OneParam(FOnAudioFinishedNative, UAudioComponent*)
// DECLARE_MULTICAST_DELEGATE_ThreeParams(FOnAudioPlaybackPercentNative, const UAudioComponent*, const USoundWave*, const float)
AudioComponent->OnAudioFinishedNative.AddUObject(this, &AMyActor::OnSoundFinishedNative);
AudioComponent->OnAudioPlaybackPercentNative.AddUObject(this, &AMyActor::OnPlaybackPercentNative);
`
Read more
name: ue-audio-system description: "Use this skill when working with audio, sound, music, UAudioComponent, PlaySoundAtLocation, SoundCue, MetaSound, attenuation, submix, concurrency, SFX, or spatial audio in Unreal Engine. See references/audio-setup-patterns.md for music system and ambient soundscape architectures. For VFX audio synchronization, see ue-niagara-effects." metadata: version: 1.0.0
UE Audio System
You are an expert in Unreal Engine's audio systems, covering UAudioComponent, sound asset types, spatial attenuation, concurrency management, submix routing, MetaSounds, and runtime audio analysis.
Context Check
Before implementing audio, read `.agents/ue-project-context.md` for:
- **Audio plugins** enabled (Resonance Audio, Steam Audio, Wwise, FMOD, MetaSound plugin version)
- **Target platforms** — mobile has strict voice limits; consoles differ from PC
- **Dedicated server** flag — audio must be skipped server-side or it will crash/log errors
- **VR flag** — VR projects require binaural spatialization settings
Information Gathering
Ask about:
1. One-shot SFX, looping ambient, music, UI feedback, or dialogue? 2. Spatialized (follows actor) or global 2D? 3. Concurrency concern (gunshots, footsteps, explosions)? 4. Runtime control needed (fade, pause, parameter changes)? 5. MetaSound procedural or pre-authored SoundCue/SoundWave?
---
Sound Asset Hierarchy
USoundBase // abstract base (SoundBase.h) ├── USoundWave // raw PCM/compressed audio asset ├── USoundCue // node-graph: random, modulator, mixer, attenuator nodes └── UMetaSoundSource // procedural audio graph (MetaSound plugin)
**USoundWave** — Import .wav/.ogg/.flac. Set `SoundClassObject` and `AttenuationSettings` on asset.
**USoundCue** — Node graph combining multiple waves. Key nodes: `USoundNodeRandom`, `USoundNodeModulator`, `USoundNodeMixer`, `USoundNodeAttenuation`, `USoundNodeLooping`, `USoundNodeDelay`, `USoundNodeDistanceCrossFade`.
**UMetaSoundSource** — Procedural audio graph. Declare typed inputs (float, bool, int32, trigger). Set parameters at runtime via `UAudioComponent::SetFloatParameter`, `SetBoolParameter`, `SetIntParameter`.
Streaming Long Audio
For music and ambient tracks exceeding ~30 seconds, set `USoundWave::LoadingBehavior`: `ESoundWaveLoadingBehavior::ForceInline` for short SFX, `RetainOnLoad` for music loaded at level start. Long files should use `LoadOnDemand` to avoid loading the full waveform into memory. In the editor: SoundWave asset → Details → Loading → Loading Behavior.
---
Playing Sounds from C++
Fire-and-Forget
#include "Kismet/GameplayStatics.h"
// 2D — not spatialized (UI, music)
UGameplayStatics::PlaySound2D(
this, ImpactSound, 1.0f /*Vol*/, 1.0f /*Pitch*/, 0.0f /*StartTime*/,
ConcurrencySettings, OwningActor
);
// 3D — spatialized, requires AttenuationSettings on the sound asset
UGameplayStatics::PlaySoundAtLocation(
this, GunShotSound, GetActorLocation(), FRotator::ZeroRotator,
1.0f, 1.0f, 0.0f,
AttenuationOverride, // USoundAttenuation* (nullptr = use asset default)
ConcurrencyOverride, // USoundConcurrency* (nullptr = use asset default)
this // OwningActor for per-owner concurrency
);Spawn with Handle
// Returns UAudioComponent* — auto-destroyed when sound finishes if bAutoDestroy=true
UAudioComponent* Comp = UGameplayStatics::SpawnSoundAtLocation(
this, ExplosionSound, Location, FRotator::ZeroRotator,
1.0f, 1.0f, 0.0f, AttenuationSettings, nullptr, /*bAutoDestroy=*/true
);
// Attach to a moving component (vehicle engine)
UAudioComponent* EngineAudio = UGameplayStatics::SpawnSoundAttached(
EngineLoopSound, GetMesh(), NAME_None,
FVector::ZeroVector, FRotator::ZeroRotator,
EAttachLocation::SnapToTargetIncludingScale,
/*bStopWhenAttachedToDestroyed=*/true,
1.0f, 1.0f, 0.0f, AttenuationSettings, nullptr,
/*bAutoDestroy=*/false // keep alive for looping
);UAudioComponent as Permanent Actor Component
// In constructor:
AudioComponent = CreateDefaultSubobject<UAudioComponent>(TEXT("AudioComponent"));
AudioComponent->SetupAttachment(RootComponent);
AudioComponent->bAutoActivate = false;
AudioComponent->bStopWhenOwnerDestroyed = true;Playback Control
AudioComponent->SetSound(EngineLoopSound); AudioComponent->Play(/*StartTime=*/0.0f); AudioComponent->Stop(); AudioComponent->SetPaused(true); AudioComponent->FadeIn(0.5f, 1.0f, 0.0f, EAudioFaderCurve::Linear); AudioComponent->FadeOut(1.0f, 0.0f, EAudioFaderCurve::Linear); AudioComponent->SetVolumeMultiplier(0.5f); AudioComponent->SetPitchMultiplier(1.2f); // Query play state (EAudioComponentPlayState: Playing, Stopped, Paused, FadingIn, FadingOut) EAudioComponentPlayState State = AudioComponent->GetPlayState();
Delegates (AudioComponent.h)
// Declared in AudioComponent.h: // DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnAudioFinished) // DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnAudioPlaybackPercent, const USoundWave*, PlayingSoundWave, const float, PlaybackPercent) // DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnAudioPlayStateChanged, EAudioComponentPlayState, PlayState) AudioComponent->OnAudioFinished.AddDynamic(this, &AMyActor::OnSoundFinished); AudioComponent->OnAudioPlaybackPercent.AddDynamic(this, &AMyActor::OnPlaybackPercent); AudioComponent->OnAudioPlayStateChanged.AddDynamic(this, &AMyActor::OnPlayStateChanged); // Native (non-UObject) binding — no GC overhead: // DECLARE_MULTICAST_DELEGATE_OneParam(FOnAudioFinishedNative, UAudioComponent*) // DECLARE_MULTICAST_DELEGATE_ThreeParams(FOnAudioPlaybackPercentNative, const UAudioComponent*, const USoundWave*, const float) AudioComponent->OnAudioFinishedNative.AddUObject(this, &AMyActor::OnSoundFinishedNative); AudioComponent->OnAudioPlaybackPercentNative.AddUObject(this, &AMyActor::OnPlaybackPercentNative); `
A collection of 27 AI agent skills for Unreal Engine C++ development. Built for game developers who want AI coding agents to help write correct, production-quality UE5 C++ code.
Other skills on unreal-engine-skills.
- /ue-actor-component-architecture
Use this skill when working with Actor and component design in Unreal Engine. Triggers on: Actor, component, BeginPlay, Tick, SpawnActor, lifecycle, CreateDefaultSubobject, composition, EndPlay, PostInitializeComponents, UActorComponent, USceneComponent, UINTERFACE, attachment,
Open skill - /ue-ai-navigation
Use this skill when implementing AI, AIController, behavior tree, blackboard, AI perception, NavMesh, EQS, navigation, pathfinding, State Tree, or Smart Objects in Unreal Engine. See references/behavior-tree-patterns.md for BT patterns and references/eqs-reference.md for EQS
Open skill - /ue-animation-system
Use this skill when working with Unreal Engine animation: AnimInstance, montage playback, blend space, state machine, anim notify, IK, AnimGraph, skeletal mesh, or linked anim graphs. See references/anim-notify-reference.md for notify patterns and references/locomotion-setup.md
Open skill - /ue-async-threading
Use this skill when working with Unreal Engine async operations, threading, parallel execution, or concurrency. Also use when the user mentions 'FRunnable', 'FAsyncTask', 'TaskGraph', 'UE::Tasks', 'ParallelFor', 'TFuture', 'TPromise', 'Async()', 'thread safety',
Open skill - /ue-character-movement
Use this skill when working with character movement, CharacterMovementComponent, CMC, movement modes, walking, falling, swimming, flying, custom movement, network prediction, FSavedMove, root motion, floor detection, step-up, or character physics. Also use for 'PhysWalking',
Open skill - /ue-cpp-foundations
Use when writing Unreal Engine C++ code involving UPROPERTY, UFUNCTION, UCLASS, TArray, TMap, delegates, FString, garbage collection, or smart pointers. Also use when the user asks about "UE C++", USTRUCT, UENUM, FName, FText, TObjectPtr, TWeakObjectPtr, UObject lifetime,
Open skill

