Rust Bevy Eventsについて
はじめに
本記事はBevy非公式(と思えないほど素晴らしい)サイトのメモである。
メモ
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は保持され、その後破棄される。