Expand description

The goal of this crate is to offer an easy way for bevy games to load all their assets in a loading State.

bevy_asset_loader introduces the derivable trait AssetCollection. Structs with asset handles can be automatically loaded during a configurable loading State. Afterwards they will be inserted as resources containing loaded handles and the plugin will switch to a second configurable State.


fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .init_state::<GameState>()
        .add_loading_state(
            LoadingState::new(GameState::Loading)
                .continue_to_state(GameState::Next)
                .load_collection::<AudioAssets>()
                .load_collection::<ImageAssets>()
        )
        .add_systems(Update, use_asset_handles.run_if(in_state(GameState::Next)))
        .run();
}

#[derive(AssetCollection, Resource)]
struct AudioAssets {
    #[asset(path = "audio/background.ogg")]
    background: Handle<AudioSource>,
    #[asset(path = "audio/plop.ogg")]
    plop: Handle<AudioSource>
}

#[derive(AssetCollection, Resource)]
pub struct ImageAssets {
    #[asset(path = "images/player.png")]
    pub player: Handle<Image>,
    #[asset(path = "images/tree.png")]
    pub tree: Handle<Image>,
}

// since this function runs in MyState::Next, we know our assets are loaded.
// We can get their handles from the AudioAssets resource.
fn use_asset_handles(mut commands: Commands, audio_assets: Res<AudioAssets>) {
    commands.spawn(AudioBundle {
        source: audio_assets.background.clone(),
        ..default()
    });
}

#[derive(Clone, Eq, PartialEq, Debug, Hash, Default, States)]
enum GameState {
    #[default]
    Loading,
    Next
}

Modules

  • Trait definition for types that represent a collection of assets
  • Types and infrastructure to load and use dynamic assets
  • A game state responsible for loading assets
  • Trait definition for mapped assets collection
  • Most commonly used types