The Bevy Book - 2.4 插件Plugins
插件
Bevy的核心原则之一是模块化。所有 Bevy 引擎功能都作为插件实现。这包括渲染器等内部功能,但游戏本身也是作为插件实现的!这使开发人员能够挑选他们想要的功能。不需要用户界面?不要注册 UiPlugin
。想要构建无外设服务器?不要注册 RenderPlugin
。
这也意味着您可以自由地更换任何您不喜欢的组件。如果您觉得有必要,欢迎您构建自己的UiPlugin
,但如果您认为自己做的很好有用,请考虑将其贡献给Bevy!
但是,大多数开发人员不需要自定义体验,只需要轻松获得“全引擎”体验。为此,Bevy提供了一组“默认插件”。
Bevy 的默认插件 Default Plugins
让我们通过添加“default Bevy plugins"来使我们的应用程序更有趣。add_plugins(DefaultPlugins)
添加了大多数人期望从引擎获得的功能,例如2D / 3D渲染器,资源加载,UI系统,窗口和输入。
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.add_startup_system(add_people)
.add_system(hello_world)
.add_system(greet_people)
.run();
}
再次运行cargo run
.
你应该注意到两件事:
- 应该会弹出一个窗口。这是因为我们现在有
WindowPlugin
,它定义了窗口界面(但实际上不知道如何制作窗口),而WinitPlugin
使用 winit 库使用操作系统的本机窗口 API 创建窗口。 - 您的控制台现在充满了"hello"消息:这是因为
DefaultPlugins
向我们的应用程序添加了一个"event loop"。我们应用程序的 ECS 计划现在每个"frame"循环运行一次。我们将尽快解决控制台垃圾消息。
请注意,add_plugins(DefaultPlugins)
这等效于以下内容:
fn main() {
App::new()
.add_plugin(CorePlugin::default())
.add_plugin(InputPlugin::default())
.add_plugin(WindowPlugin::default())
/* more plugins omitted for brevity */
.run();
}
您可以自由使用适合您的任何方法!
创建您的第一个插件
为了更好地组织,让我们将所有的“hello”逻辑移动到插件中。要创建插件,我们只需要实现Plugin
接口。将以下代码添加到您的main.rs
文件中:
pub struct HelloPlugin;
impl Plugin for HelloPlugin {
fn build(&self, app: &mut App) {
// add things to your app here
}
}
然后在您的应用程序中注册插件,如下所示:
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.add_plugin(HelloPlugin)
.add_startup_system(add_people)
.add_system(hello_world)
.add_system(greet_people)
.run();
}
现在剩下的就是将我们的系统移动到 HelloPlugin
中,这只是一个剪切和粘贴的问题。插件函数build()
中的app
变量与我们在main()
函数中使用的 builder type 相同:
impl Plugin for HelloPlugin {
fn build(&self, app: &mut App) {
app.add_startup_system(add_people)
.add_system(hello_world)
.add_system(greet_people);
}
}
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.add_plugin(HelloPlugin)
.run();
}
请尝试再次运行该应用。它应该完全按照以前的做法去做。在下一节中,我们将使用Resources 修复“"hello"垃圾消息。