佐藤のメモ帳

Rust, Python, Java, AWS, etc...

Rust Bevy Resourceについて

はじめに

本記事はBevy非公式(と思えないほど素晴らしい)サイトのメモである。

bevy-cheatbook.github.io

メモ

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>();