佐藤のメモ帳

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

Rust Bevy Local Resourcesについて

はじめに

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

bevy-cheatbook.github.io

メモ

Local<T>ResMut<T>と同様のシステムパラメータである。これによりあらゆる型のインスタンスに変更可能でアクセスできる。
Res<T>/ResMut<T>は全システム間で共有されるグローバルな単一のインスタンスを参照する。一方、Local<T>は特定システム専用の個別のインスタンスである。

#[derive(Default)]
struct MyState;

fn my_system1(mut local: Local<MyState>) {
}

fn my_system2(mut local: Local<MyState>) {
    // 引数localは上のmy_systemで参照しているlocalとは別のインスタンス
}

Local<T>DefaultまたはFromWorldを実装しなければならない。 同じ型のLocalをSystemに複数持たせることができる。

SystemをAppに追加する時、.configファイルを使用して、Localをデフォルト値以外の値に初期化できる。
.configは特定のシステムパラメータを構成するBevyAPIである。ほとんどのシステムパラメータはこれをサポートしていないが、Localはサポートしている。

/// `my_system`用の設定
///
/// このSystemは`Local<MyConfig>を使用して設定にアクセスする。
/// `App`ビルド時、設定に値が設定される。
///
#[derive(Default)]
struct MyConfig {
    magic: usize,
}

fn my_system(
    mut cmd: Commands,
    my_res: Res<MyStuff>,
    config: Local<MyConfig>,
) {
    // TODO: do stuff
}

fn main() {
    App::build()
        .add_system(my_system.system().config(|params| {
            // `Local<MyConfig>は`my_system`の第3引数である。
            // したがって、`.2`でアクセスできる。
            params.2 = Some(MyConfig {
                magic: 420,
            });
        }))
        .run();
}