Latest commit d7a897d
插件
相关的官方文档:[plugin],[plugin_group]。
把要添加到 [App Builder] 的东西组合起来就是插件。
struct MyPlugin; impl Plugin for MyPlugin { fn build(&self, app: &mut App) { app .init_resource::<MyResource>() .add_event::<MyEvent>() .add_startup_system(plugin_init) .add_system(my_system); } } fn main() { App::new() .add_plugins(DefaultPlugins) .add_plugin(MyPlugin) .run(); }
[TODO] 对于你自己项目的内部组织,插件的主要价值在于不必声明你所有的 Rust 类型和函数为 pub,只是为了它们可以从 main 访问并添加到 app builder 中。插件可以让你从多个不同的地方添加东西到你的应用程序中,比如单独的 Rust 文件/模块。
插件可以融入你的游戏框架。一些建议:
- 为不同的 [State] 创建插件。
- 为各种子系统创建插件,例如物理处理、输入处理等。
插件组
插件组能一次注册多个插件,例如 Bevy 的 DefaultPlugins 和 MinimalPlugins。也可以创建自定义插件组:
struct MyPluginGroup; impl PluginGroup for MyPluginGroup { fn build(&mut self, group: &mut PluginGroupBuilder) { group .add(FooPlugin) .add(BarPlugin); } } fn main() { App::new() .add_plugins(DefaultPlugins) .add_plugins(MyPluginGroup) .run(); }
添加插件组时,可以在禁用一些插件的同时保留其他插件。例如,想自定义日志记录(替换掉默认的日志记录),可以禁用 LogPlugin:
#![allow(unused)] fn main() { App::build() .add_plugins_with(DefaultPlugins, |plugins| { plugins.disable::<LogPlugin>() }) .run(); }
注意,禁用功能不会删除代码来避免二进制膨胀,禁用的插件仍然会编译进程序。如果想精简构建文件,可以禁用 Bevy 默认的 Cargo 功能,或者单独依赖 Bevy 的子 Crate。
发布 Crate
想把插件发布成Crate,可以参考 Third Party Plugin Guidelines。