s&box/field-guide
the symptom, in your words

"There's no Looping field on SoundEvent"

✓ verified on engine 26.07lane: Audioposted
▸ SYMPTOM

You search SoundEvent / the .sound JSON for a Looping field to make music or ambience repeat. It isn't there. Stock "loop" events look identical to one-shots in the .sound file.

▸ CAUSE

SoundEvent has NO Looping field (verified against Sandbox.Engine.xml). Install loop .sound files are byte-identical to non-loop ones in the event JSON.

Looping lives on the compiled .vsnd (SoundFile.LoadOptions.Loop) — an editor-import concern — not on the event resource.

▸ FIX

Option A — editor import

Set loop on the sound file import / compiled vsnd options in the editor (the actual control surface). (needs verification) of the exact editor UI label on your build — the engine field is SoundFile.LoadOptions.Loop.

Option B — loop from code (zero editor step)

snippet
SoundHandle handle;

void StartLoop(string eventPath)
{
    handle = Sound.Play(eventPath /*, worldPos */);
}

void TickLoop()
{
    if (!handle.IsValid() || handle.Finished || !handle.IsPlaying)
        handle = Sound.Play(eventPath /*, worldPos */);
}

void StopLoop(float fade = 0.25f)
{
    if (handle.IsValid())
        handle.Stop(fade);
}

Keep the handle; re-trigger when finished. For ambient beds, pump this from a small component's OnUpdate under a unique per-object key.

Don't per-frame-retry a failed play forever — retry once after ~2s, then disable with one warn (invalid handle otherwise = one engine warning per frame). See also custom-sound-wont-play for name-form bugs vs missing assets.

▸ WHY IT WORKS

The event resource describes how to play a vsnd (volume, distance, mixer). Whether the underlying sample wraps is a property of the sound file compile, not the event. Code-side re-trigger mirrors that wrap without needing a Looping field on SoundEvent.

Verified on engine 26.07 — seen in a real project.
s&box moves fast; an undated fix is a liability. Spot a stale detail?