"Sound.Play() is fully static: no component wiring needed"
▸ SYMPTOM
You wire up a component or bootstrap system to play a sound, but nothing plays, or you spend time searching for a "SoundComponent" that doesn't exist.
▸ CAUSE
The sound API is entirely static. There is no component to attach to a GameObject. Trying to find one or wiring custom infrastructure around it is unnecessary complexity.
▸ FIX
Call the static methods directly:
// 2D (UI, ambient, non-positional)
Sound.Play( "sounds/ui_click.sound" );
// 3D (positional, returns a handle)
SoundHandle handle = Sound.Play( "sounds/explosion.sound", Transform.Position );SoundHandle gives you runtime control:
.Volume/.Pitch/.Position: adjust on the fly.IsPlaying/.Finished: poll state.Stop( fadeSeconds ): fade out.IsValid(): check the handle is still live
A missing .sound event won't hard-throw, but wrap playback in a try/catch if the asset might not exist yet (e.g. procedurally generated sound events) so a missing file can't break gameplay.
▸ WHY IT WORKS
The engine manages the audio subsystem globally. Sound.Play() submits the event to the mixer directly: no per-object lifecycle, no component enable/disable, no OnStart timing. This is the same pattern as particle one-shots: fire and optionally hold the handle.