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_resourcemessages: [Message1, Message2]- Register messages withadd_messageplugins: [Plugin1, Plugin2]- Add sub-plugins withadd_pluginsstates: [State1]- Initialize states withinit_statesub_states: [SubState1]- Add sub-states withadd_sub_statereflect: [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(Message)]
struct MyMessage;
fn setup_system() {}
fn update_system() {}
define_plugin!(MyPlugin {
resources: [MyResource],
messages: [MyMessage],
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_message::<MyMessage>()
.add_systems(Startup, setup_system)
.add_systems(Update, update_system);
}
}