macro_rules! define_plugin {
($plugin_name:ident { $($config:tt)* }) => { ... };
}
Expand description
Define a Bevy plugin declaratively, eliminating boilerplate registration code.
This macro takes a plugin name and a configuration block, then generates
a complete impl Plugin for PluginName
with all the specified registrations.
§Supported Configuration Options
resources: [Type1, Type2]
- Initialize resources withinit_resource
events: [Event1, Event2]
- Register events withadd_event
plugins: [Plugin1, Plugin2]
- Add sub-plugins withadd_plugins
states: [State1]
- Initialize states withinit_state
sub_states: [SubState1]
- Add sub-states withadd_sub_state
reflect: [Type1, Type2]
- Register types for reflectionstartup: [system1, system2]
- Add startup systemsupdate: [system3, system4]
- Add update systems (supports conditions/ordering)fixed_update: [system5]
- Add fixed update systemson_enter: { State::Variant => [system6] }
- Add state enter systemson_exit: { State::Variant => [system7] }
- Add state exit systemscustom_init: |app| { ... }
- Custom initialization logiccustom_finish: |app| { ... }
- Custom finish logic
§Example
use bevy_plugin_builder::define_plugin;
use bevy::prelude::*;
#[derive(Resource, Default)]
struct MyResource;
#[derive(Event)]
struct MyEvent;
fn setup_system() {}
fn update_system() {}
define_plugin!(MyPlugin {
resources: [MyResource],
events: [MyEvent],
startup: [setup_system],
update: [update_system]
});
This generates:
pub struct MyPlugin;
impl Plugin for MyPlugin {
fn build(&self, app: &mut App) {
app.init_resource::<MyResource>()
.add_event::<MyEvent>()
.add_systems(Startup, setup_system)
.add_systems(Update, update_system);
}
}