插件
可参考的官方例子:
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 的 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();
}
在向应用程序添加插件组时,你可以禁用一些插件,而保留其他插件。
例如,如果你想手动设置日志(用你自己的 tracing
订阅者),你可以禁用 Bevy 的 LogPlugin
:
App::new()
.add_plugins_with(DefaultPlugins, |plugins| {
plugins.disable::<LogPlugin>()
})
.run();
请注意,这只是简单地禁用了功能,但它不是真正删除代码以避免应用程序的二进制文件的膨胀。被禁用的插件仍然会被编译进你的程序中。
如果你想给你的编译产物瘦身,你应该禁用 Bevy 的默认库功能,或者单独使用 Bevy 的各种子库。
发布库
插件给了你一个很好的途径来发布基于 Bevy 的库,让其他人可以很容易地将其应用到他们的项目中。
如果你打算将插件发布为公共使用的库,你应该阅读官方的插件作者指南。
不要忘记在官方网站上向 Bevy Assets 提交关于你插件的条目,这样人们可以更容易地找到你的插件。你可以通过在 Github 仓库 中提交一个 PR 来做到这一点。
如果你的插件有兴趣支持 Bevy 开发主分支,请参考这里的建议。