use bevy::prelude::*; pub(super) fn plugin(app: &mut App) { app.add_systems( Update, apply_global_volume.run_if(resource_changed::), ); } /// An organizational marker component that should be added to a spawned [`AudioPlayer`] if it's in the /// general "music" category (e.g. global background music, soundtrack). /// /// This can then be used to query for and operate on sounds in that category. #[derive(Component, Reflect, Default)] #[reflect(Component)] pub struct Music; /// A music audio instance. pub fn music(handle: Handle) -> impl Bundle { (AudioPlayer(handle), PlaybackSettings::LOOP, Music) } /// An organizational marker component that should be added to a spawned [`AudioPlayer`] if it's in the /// general "sound effect" category (e.g. footsteps, the sound of a magic spell, a door opening). /// /// This can then be used to query for and operate on sounds in that category. #[derive(Component, Reflect, Default)] #[reflect(Component)] pub struct SoundEffect; /// A sound effect audio instance. pub fn sound_effect(handle: Handle) -> impl Bundle { (AudioPlayer(handle), PlaybackSettings::DESPAWN, SoundEffect) } /// [`GlobalVolume`] doesn't apply to already-running audio entities, so this system will update them. fn apply_global_volume( global_volume: Res, mut audio_query: Query<(&PlaybackSettings, &mut AudioSink)>, ) { for (playback, mut sink) in &mut audio_query { sink.set_volume(global_volume.volume * playback.volume); } }