2 unstable releases

0.2.0-alpha.1 Nov 5, 2024
0.1.0 Nov 5, 2024

#832 in Game dev

MIT/Apache

36KB
489 lines

bevy_mod_reaction

License Crates.io Downloads Docs CI

Reactive components for Bevy.

A Reaction is a component around a ReactiveSystem, which runs every time its parameters have changed. Bevy's built-in change detection mechanisms are used to efficiently react to changes in state.

/// This reaction will only run if a `Damage` component is changed.
commands.spawn(Reaction::new(|_: In<Scope>, query: Query<&Damage>| {
    for dmg in &query {
        dbg!(dmg.0);
    }
}));

For coarse-grained reactivity ReactiveQuery tracks the entities read and only re-runs the current system if those values have changed. Bundles of components can also be derived:

// Coarse-grained reactivity:
// This reaction will only run when the `Health` component belonging to `scope.entity` changes.
commands.spawn((
    Health(100),
    Reaction::derive(|scope: In<Scope>, mut query: ReactiveQuery<&Health>| {
        let health = query.get(scope.entity).unwrap();
        Damage(health.0 * 2)
    }),
));

Switch statements are also supported, with more primitives coming soon

commands.spawn((
    Health(0),
    Reaction::switch(
        |scope: In<Scope>, query: ReactiveQuery<&Health>| {
            let health = query.get(scope.entity).unwrap();
            health.0 == 0
        },
        || Armor(50),
        || Damage(100),
    ),
));

Dependencies

~24MB
~456K SLoC