Rust Bevy Resourceについて
はじめに
本記事はBevy非公式(と思えないほど素晴らしい)サイトのメモである。
メモ
BevyにおいてResourceとは単一のグローバルなインスタンスに保存されたデータ
である。
Componentと同様にstruct
またはenum
の型で定義する。
また、型は一意でなければならないこともComponentと同様である。
struct GoalsReached { main_goal: bool, bonus: bool, }
SystemはRes
またはResMut
を使用してResourceにアクセスする。
単純な構造のResourceを作成する場合はDefault
を実装する。
#[derive(Default)] struct StartingLevel(usize);
より複雑な構造のResourceを作成する場合はFromWorld
を実装する。
struct MyFancyResource { /* stuff */ } impl FromWorld for MyFancyResource { fn from_world(world: &mut World) -> Self { // ここから様々なECS(Entity, Component, System)構成部品にアクセスすることができる。 // たとえば、別のResourceを変更することもできる。 let mut x = world.get_resource_mut::<MyOtherResource>().unwrap(); x.do_mut_stuff(); MyFancyResource { /* stuff */ } } }
作成したResourceは以下のようにApp
に登録することができる。
fn main() { App::build() // ... // もし、`Default`か`FromWorld`を実装しているResourceであれば .init_resource::<MyFancyResource>() // そうではない場合、または、特定の値を設定したResourceを登録したい場合 .insert_resource(StartingLevel(3)) // ... .run(); }
また、Command
を使用してSystem内で登録することもできる。
commands.insert_resource(GoalsReached { main_goal: false, bonus: false }); commands.remove_resource::<MyResource>();