This Bevy plugin reduces boilerplate when loading game assets. The crate offers the AssetCollection trait and can automatically load structs that implement it. The trait can be derived.

Deriving AssetCollection leads to a readable definition of assets in your game code. A simple example loading an image and a sound file looks like this:

pub struct SomeAssets {
    #[asset(path = "sounds/background.ogg")]
    pub background: Handle<AudioSource>,
    #[asset(path = "textures/castle.png")]
    pub castle: Handle<Image>,

Apart from simple assets like above you can also define more complex assets with the derive macro:

pub struct SomeAssets {
    #[asset(path = "sounds/image.png", standard_material)]
    pub standard_material: Handle<StandardMaterial>,
    #[asset(texture_atlas(tile_size_x = 32., tile_size_y = 64., columns = 8, rows = 2))]
    #[asset(path = "images/sprite_sheet.png")]
    pub female_adventurer: Handle<TextureAtlas>,

You can also configure the path to a certain asset file at run time. This is done via a mapping defined in a resource.

pub struct DynamicAssetCollection {
    #[asset(key = "character")]
    player: Handle<Image>,

For this to work, the key character needs to be defined in the AssetKeys resource before entering the loading state. This can either be done manually or by loading ron files (see my blog post on dynamic assets).

The features described here can all be found in complete bevy examples in the plugin's GitHub repository.

For a background of why I wrote this plugin and thoughts on future functionality, see the post "Asset handling in Bevy apps".

For an example game using bevy_asset_loader, you can take a look at the internal LoadingPlugin of bevy_game_template. © 2022