Audio

Four destruction audio events, deterministic weighted variation, built-in playback and middleware-neutral request delegates with their own frame budget.

The four events

ESDFAudioEvent:

EventEmitted when
LightImpactA valid hit below the profile’s heavy thresholds
HeavyImpactA hit at or above HeavyImpactMinimumPower or HeavyImpactMinimumImpulse
BreakThe object is destroyed
DebrisImpactA spawned debris piece collides fast enough

Weighted variations

Each event reads an array of FSDFWeightedSound from the profile:

PropertyDefaultMeaning
SoundnoneSoft USoundBase reference
Weight1.0Relative selection weight
MinimumVolume0.9Lower bound of the volume multiplier
MaximumVolume1.0Upper bound
MinimumPitch0.95Lower bound of the pitch multiplier
MaximumPitch1.05Upper bound

Empty entries and zero-weight entries are ignored safely — an incomplete array never crashes and never plays silence.

SoundBase is the accepted type, so Sound Waves, Sound Cues and MetaSound sources all work. The profile can also carry an optional SoundAttenuation and SoundConcurrency asset applied to built-in playback.

Shipped break cues

The runtime profile templates generated by the authoring presets come with a break sound already assigned, from the plugin’s own demo audio:

Preset familyBreak cue
Wood, Wooden Crate, Wooden Furniture, Wooden CoffinSC_SDF_WoodenCrate_Break
Wooden Barrel (Semantic)SC_SDF_WoodenBarrel_Break
CeramicSC_SDF_CeramicImpact
StoneSC_SDF_StoneImpact
Glass, Glass VesselSC_SDF_GlassBreak
Genericnone — a neutral preset assumes no material

These are starting points on the generated profile, not hard-wired behaviour: replace them on your own profiles or preset templates like any other weighted variation.

Deterministic selection

SelectWeightedSoundVariation(Variations, RandomSeed, OutVolumeMultiplier, OutPitchMultiplier) is a pure, static, Blueprint-callable function. The same seed always selects the same variation with the same volume and pitch multipliers.

The framework uses it internally, and it is exposed so a middleware layer or a test can reproduce the exact selection the framework would have made.

Built-in playback versus delegates

Two independent switches on the profile:

PropertyEffect
bEnableAudioRequestsMaster switch: emit audio requests at all
bEnableBuiltInAudioPlaybackAlso play the selected sound through UGameplayStatics

Requests are always emitted

Disabling built-in playback does not disable the requests. The delegates still fire with a fully resolved selection, which is exactly what a middleware integration needs.

The request payload

FSDFDestructionAudioRequest:

FieldMeaning
EventWhich of the four events
SourceActorThe destructible
LocationWorld position
ImpactDirectionDirection of the causing hit
ImpactSpeedSpeed associated with the event
DestructionPowerPower of the causing hit
SelectedSoundThe variation the framework picked
VolumeMultiplierResolved volume multiplier
PitchMultiplierResolved pitch multiplier
RandomSeedSeed used for the selection
SelectedVariationIndexIndex into the profile array
bBuiltInPlaybackRequestedBuilt-in playback was configured
bBuiltInPlaybackAttemptedBuilt-in playback was actually attempted
bBuiltInPlaybackSuppressedByBudgetThe per-frame built-in audio budget suppressed it

Where to listen

ScopeDelegate
One objectUSDFDestructibleComponent::OnDestructionAudioRequested
Whole worldUSDFDestructionSubsystem::OnDestructionAudioRequested

The component delegate fires before built-in playback is attempted, which makes it a genuine interception point. The subsystem delegate is the right hook for a global router — MetaSounds, Wwise, FMOD or your own pooled audio system.

Middleware integration pattern

  1. Set bEnableAudioRequests = true and bEnableBuiltInAudioPlayback = false on your profiles.
  2. Bind USDFDestructionSubsystem::OnDestructionAudioRequested once, at world start.
  3. Map Event, DestructionPower and any gameplay tags from the causing hit to your own event names.
  4. Post the event at Location, applying VolumeMultiplier and PitchMultiplier if you want the framework’s variation, or ignoring them and using your middleware’s own randomisation.

You can also leave the Sound arrays empty in that setup: the request is still emitted with SelectedVariationIndex = -1, which your router can treat as “no asset, use my own mapping”.

Debris impact audio

Debris collisions are throttled by three profile properties so a shattering pot does not produce thirty simultaneous clacks:

  • MinimumDebrisImpactSpeed — slower collisions are silent;
  • DebrisImpactCooldown — minimum seconds between debris sounds;
  • MaximumDebrisImpactSoundsPerDebrisActor — hard cap per piece, default 1.

Audio budget

The world subsystem caps MaxBuiltInAudioEventsPerFrame (default 32). The cap applies only to built-in playback attempts. Requests always reach the delegates, so a middleware integration is never silently starved by the framework’s own budget.

Diagnostics through GetAudioStats return FSDFDestructionAudioStats:

FieldMeaning
TotalRequestsRequests emitted since the last reset
TotalBuiltInPlaybackAttemptsBuilt-in playbacks attempted
TotalBuiltInPlaybackSuppressedBuilt-in playbacks suppressed by the budget
BuiltInPlaybackAttemptsThisFrameCurrent frame counter

GetLastAudioRequest returns the most recent payload and ResetAudioStatistics clears the counters without touching active state.

Last updated: 2026-08-25

Type to search titles, sections and keywords.