佐藤のメモ帳

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

Rust Bevy Eventsについて

はじめに

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

bevy-cheatbook.github.io

メモ

BevyではEventという形式で、System間でゲーム内のイベント(レベルアップ、ゲームクリア、敵エンカウントなど)に関する情報を受け渡す。
Eventを送信する場合、EventWriter<T>、Eventを受信する場合、EventReader<T>を使う。

全てのEventReader<T>はEventを個別に追跡できるので、複数のシステムから同じイベントを処理できる。

// Event
struct LevelUpEvent(Entity);

fn player_level_up(
    mut ev_levelup: EventWriter<LevelUpEvent>,
    query: Query<(Entity, &PlayerXp)>,
) {
    for (entity, xp) in query.iter() {
        if xp.0 > 1000 {
            // レベルアップEventを送信
            ev_levelup.send(LevelUpEvent(entity));
        }
    }
}

fn debug_levelups(
    // レベルアップEventを受信
    mut ev_levelup: EventReader<LevelUpEvent>,
) {
    for ev in ev_levelup.iter() {
        eprintln!("Entity {:?} leveled up!", ev.0);
    }
}

App Builderで事前にEventを登録する必要がある。

fn main() {
    App::build()
        // レベルアップEventを登録
        .add_event::<LevelUpEvent>()
        .add_system(player_level_up.system())
        .add_system(debug_levelups.system())
        .run();
}

注意

Eventは永続的でない。次フレームの終わりまでEventは保持され、その後破棄される。