Quick answer: The wave must be mono (Force Mono on the SoundWave asset works), the SoundCue must have an Attenuation Settings asset assigned, and you must call PlaySoundAtLocation (not PlaySound2D). All three matter; missing any one drops you to flat stereo.

Footstep cue plays at full volume from both speakers regardless of where the player walks. The wave file is fine, the cue plays at the right times, but the 3D position doesn’t come through. Three settings must align.

The Symptom

SoundCue plays in PIE but the audio is flat stereo: same volume left and right, no falloff with distance, no panning when the player rotates. Sounds correct in the wave editor preview but not in-game.

What Causes This

Unreal’s audio engine spatializes only mono streams. A stereo wave carries L/R channels that already encode positional information; the spatializer cannot meaningfully reposition those. Even with everything else configured correctly, a stereo source wave plays flat.

Spatialization also requires an Attenuation asset on the SoundCue. Without one, the cue is “2D” and the audio engine doesn’t apply distance falloff or panning.

The Fix

Step 1: Make the wave mono. Open the SoundWave asset (the .uasset wrapping the .wav). In Details, find Sound Group Sound → Force Mono. Tick it. The wave is now downmixed to mono on import.

Or reimport from a mono source — preferred for new content because the downmix is lossy and you keep more headroom by authoring mono.

Step 2: Create an Attenuation asset. Right-click in Content Browser → Audio → Sound Attenuation. Name it (e.g. SA_Footsteps).

Attenuation (Volume): true
Attenuation Function: Inverse
Falloff Distance:     3000      // 30 m
Min Radius:           100       // 1 m of full volume
Spatialization:       Panning  // or Binaural for headphones
Air Absorption:       true

Step 3: Assign the Attenuation to the cue. Open the SoundCue. In Details → Attenuation → Override Attenuation, tick it and assign your asset. (Or assign at play time via the function call.)

Step 4: Play at a location.

// In Blueprint or C++
UGameplayStatics::PlaySoundAtLocation(
    this,
    FootstepCue,
    GetActorLocation(),
    FRotator::ZeroRotator,
    1.0f, 1.0f, 0.0f,
    AttenuationSettings   // optional override
);

PlaySound2D bypasses 3D entirely. UGameplayStatics has both; pick PlaySoundAtLocation.

Verifying

In PIE, console: au.3dVisualize.Attenuation 1. Spheres appear around active spatialized sources showing inner and outer falloff radii. Walk into and out of the sphere; volume should change. If no spheres appear, your sound is being played 2D.

Listener Position

Spatialization is computed relative to the audio listener. By default this is the active player camera. If you have a separate listener actor (cinematic), check that the AudioListener is attached to the right camera; otherwise distances are computed from the wrong reference and panning sounds reversed.

“Mono wave. Attenuation asset. PlaySoundAtLocation. The audio finds its place in space.”

Related Issues

For sound stuttering, see audio underrun. For occlusion not working, see occlusion.

Mono. Attenuation. AtLocation. The mix opens up.