Quick answer: Assign an Attenuation Settings asset to the sound (or AudioComponent) with Spatialization enabled, and play it at a world location — not via a 2D play node.
An ambient machine sound plays at full volume everywhere, with no stereo positioning. No attenuation asset is assigned, so it’s a flat 2D sound.
Create Attenuation Settings
Content Browser → Sounds → Sound Attenuation. Configure:
- Enable Spatialization: positions the sound in stereo/surround.
- Attenuation Function + Inner/Falloff Radius: distance volume curve.
- Enable Occlusion: optional, muffle behind geometry.
- Air Absorption: optional, distance-based high-frequency rolloff.
Assign It
On the SoundCue/MetaSound or the AudioComponent, set Attenuation Settings to your asset. Without it, the sound is unattenuated 2D.
Play at a Location
UGameplayStatics::SpawnSoundAtLocation(World, Sound, Location, FRotator::ZeroRotator, 1.f, 1.f, 0.f, AttenuationSettings);
Or use SpawnSoundAttached for moving sources. PlaySound2D deliberately ignores attenuation — don’t use it for world sounds.
Listener Position
Spatialization is relative to the audio listener (usually the camera/player). If your listener isn’t where you think, positioning will be wrong — check SetAudioListenerOverride if you customized it.
Verifying
Walk around the machine. Volume falls off with distance; stereo pan tracks direction. Occlusion (if enabled) muffles it behind walls.
“No attenuation asset = flat 2D. Assign one with Spatialization on and play at a location.”
Build a small library of reusable Attenuation assets — ‘SmallProp’, ‘Ambient’, ‘Voice’ — instead of per-sound configs.