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 的 DefaultPluginsMinimalPlugins。也可以创建自定义插件组:

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