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"垃圾消息。

posted @ 2022-05-29 12:15  秦舒云  阅读(134)  评论(0编辑  收藏  举报