1. 程式人生 > 其它 >The Bevy Book - 2.4 外掛Plugins

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