use bevy::prelude::*; use bevy::audio::PlaybackMode; pub struct AudioPlugin; impl Plugin for AudioPlugin { fn build(&self, app: &mut App) { app.add_systems(Startup, setup); app.add_systems(Update, toggle_bgm); app.add_systems(PostUpdate, play_click); app.add_event::(); } } #[derive(Event)] pub struct AudioClickEvent(); #[derive(Component)] pub struct ComponentBGM; #[derive(Component)] pub struct ComponentThrusterSound; #[derive(Resource)] struct SoundBGM(Handle); #[derive(Resource)] pub struct SoundClick(Handle); pub fn setup( mut commands: Commands, asset_server: Res, ) { let bgm = SoundBGM(asset_server.load("tmp/FTL - Faster Than Light (2012) OST - 12 - Void (Explore)-edQw2yYXQJM.ogg")); commands.spawn(( AudioBundle { source: bgm.0.clone(), settings: PlaybackSettings::LOOP, }, ComponentBGM, )); commands.insert_resource(bgm); commands.spawn(( AudioBundle { source: asset_server.load("sounds/wakeup.ogg"), settings: PlaybackSettings::DESPAWN, }, )); commands.spawn(( ComponentThrusterSound, AudioBundle { source: asset_server.load("tmp/loopingthrust-95548.ogg"), settings: PlaybackSettings { mode: PlaybackMode::Loop, paused: true, ..default() }, }, )); let click_sound_handle = asset_server.load("tmp/analog-appliance-button-1-185276.ogg"); commands.insert_resource(SoundClick(click_sound_handle)); } pub fn toggle_bgm( keyboard_input: Res>, bgm_controller: Query<&AudioSink, With>, ) { if keyboard_input.just_pressed(KeyCode::KeyT) { if let Ok(sink) = bgm_controller.get_single() { sink.toggle() } } } pub fn play_click( mut commands: Commands, mut events: EventReader, sound: Res, ) { if !events.is_empty() { events.clear(); commands.spawn(AudioBundle { source: sound.0.clone(), // auto-despawn the entity when playback finishes settings: PlaybackSettings::DESPAWN, }); } }