bevy_asset_loader 0.27.0

Bevy plugin for asset loading
Documentation
use bevy::prelude::*;
use bevy_asset_loader::prelude::*;

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .init_state::<AppState>()
        .add_sub_state::<MainMenuState>()
        .add_loading_state(
            LoadingState::new(MainMenuState::Loading)
                .continue_to_state(MainMenuState::Game)
                .load_collection::<MyAssets>(),
        )
        .add_systems(OnEnter(MainMenuState::Game), setup)
        .run();
}

#[derive(AssetCollection, Resource)]
struct MyAssets {
    #[asset(path = "audio/background.ogg")]
    background: Handle<AudioSource>,
    #[asset(path = "images/player.png")]
    player: Handle<Image>,
}

fn setup(mut commands: Commands, my_assets: Res<MyAssets>) {
    commands.spawn(AudioPlayer(my_assets.background.clone()));
    commands.spawn(Camera2d);
    commands.spawn(Sprite::from_image(my_assets.player.clone()));
}

#[derive(Clone, Copy, Default, Eq, PartialEq, Debug, Hash, States)]
pub enum AppState {
    #[default]
    MainMenu,
}

#[derive(Debug, Clone, Copy, Default, Eq, PartialEq, Hash, SubStates)]
#[source(AppState = AppState::MainMenu)]
pub enum MainMenuState {
    #[default]
    Loading,
    Error,
    Game,
}