插件

可参考的官方例子: plugin, plugin_group.


随着你的项目的成长,使其更加模块化会非常有用。你可以把它分成"插件"。

插件只是要添加到 应用创建器 中的东西的集合。

    struct MyPlugin;

    impl Plugin for MyPlugin {
        fn build(&self, app: &mut App) {
            app
                .init_resource::<MyOtherResource>()
                .add_event::<MyEvent>()
                .add_startup_system(plugin_init)
                .add_system(my_system);
        }
    }

    fn main() {
        App::new()
            .add_plugins(DefaultPlugins)
            .add_plugin(MyPlugin)
            .run();
    }

对于你自己项目的内部组织来说,插件的主要价值来自于不必将你所有的 Rust 类型和函数声明为 pub,只是为了让它们能够从 fn main 中访问,从而被添加到应用创建器中。 插件让你从多个不同的地方向你的应用程序添加东西,就像单独的 Rust 文件/模块一样。

你可以决定插件如何融入你的游戏架构。

一些建议:

  • 为不同的游戏状态创建插件。
  • 为各种子系统创建插件,如物理系统或输入处理。

插件组

插件组一次可以注册多个插件。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();
    }

在向应用程序添加插件组时,你可以禁用一些插件,而保留其他插件。

例如,如果你想手动设置日志(用你自己的 tracing 订阅者),你可以禁用 Bevy 的 LogPlugin

        App::new()
            .add_plugins_with(DefaultPlugins, |plugins| {
                plugins.disable::<LogPlugin>()
            })
            .run();

请注意,这只是简单地禁用了功能,但它不是真正删除代码以避免应用程序的二进制文件的膨胀。被禁用的插件仍然会被编译进你的程序中。

如果你想给你的编译产物瘦身,你应该禁用 Bevy 的默认库功能,或者单独使用 Bevy 的各种子库。

发布库

插件给了你一个很好的途径来发布基于 Bevy 的库,让其他人可以很容易地将其应用到他们的项目中。

如果你打算将插件发布为公共使用的库,你应该阅读官方的插件作者指南

不要忘记在官方网站上向 Bevy Assets 提交关于你插件的条目,这样人们可以更容易地找到你的插件。你可以通过在 Github 仓库 中提交一个 PR 来做到这一点。

如果你的插件有兴趣支持 Bevy 开发主分支,请参考这里的建议。