use bevy::{audio::Volume, prelude::*}; use rand::random_range; pub struct MusicPlayerPlugin; impl Plugin for MusicPlayerPlugin { fn build(&self, app: &mut App) { app.add_systems(Startup, setup) .add_systems(Update, try_play); } } #[derive(Resource)] struct Soundtrack(Vec>); #[derive(Component)] struct MusicPlayer; fn setup(mut commands: Commands, asset_server: Res) { commands.insert_resource(Soundtrack(vec![ asset_server.load("music/fostral.wav"), asset_server.load("music/glorx.wav"), asset_server.load("music/rocknrolldixie.wav"), asset_server.load("music/whistler.wav"), ])); commands.spawn(MusicPlayer); } fn try_play( mut commands: Commands, player: Option, Without)>>, soundtrack: Res, ) { if let Some(music_player) = player { commands.entity(music_player.entity()).insert(( AudioPlayer::new(soundtrack.0[random_range(0..soundtrack.0.len())].clone()), PlaybackSettings { volume: Volume::Linear(0.2), mode: bevy::audio::PlaybackMode::Remove, ..default() }, )); } }