"Sound.Play() is fully static — no component wiring needed"
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.
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.
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.
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.