The Bevy Book - 2.4 外掛Plugins
阿新 • • 發佈:2022-05-29
外掛
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"垃圾訊息。