Expand description

§bevy-trait-resource

A way to get resources that implements a specific trait.

use bevy::prelude::*;
use bevy_trait_resource::{trait_resource, TraitResourceExt};

#[trait_resource]
pub trait IncrementTrait {
    fn value(&self) -> i32;
    fn increment(&mut self);
}

#[derive(Resource, Default)]
struct NumberValueResource {
    value: i32,
}

impl IncrementTrait for NumberValueResource {
    // Trait implementation...
}

pub fn increment_value_system(world: &mut World) {
    for res_opt in world.get_resources_trait_mut::<dyn IncrementTrait>() {
        if let Some(res) = res_opt {
            res.increment();
        }
    }
} 

struct SomePlugin;

impl Plugin for SomePlugin {
    fn build(&self, app: &mut App) {
        app.init_resource_as::<dyn IncrementTrait, NumberValueResource>();
        app.add_systems(Update, increment_value_system);
    }
}

You can also register a resource to multiple traits.

impl Plugin for SomePlugin {
    fn build(&self, app: &mut App) {
        app.init_resource::<NumberValueResource>();

        app.register_resource_as::<dyn IncrementTrait, NumberValueResource>()
           .register_resource_as::<dyn SomeOtherTrait, NumberValueResource>();
    }
}

Unregistering.

app.unregister_resource_from_trait::<dyn IncrementTrait, NumberValueResource>();

Structs§

Traits§

Attribute Macros§

  • When added to a trait declaration, generates the impls required to find a resource that implements a specific trait.