Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Commands::send_event (bevyengine#14933)
# Objective sending events tends to be low-frequency so ergonomics can be prioritized over efficiency. add `Commands::send_event` to send any type of event without needing a writer in hand. i don't know how we feel about these kind of ergonomic things, i add this to all my projects and find it useful. adding `mut this_particular_event_writer: EventWriter<ThisParticularEvent>` every time i want to send something is unnecessarily cumbersome. it also simplifies the "send and receive in the same system" pattern significantly. basic example before: ```rs fn my_func( q: Query<(Entity, &State)>, mut damage_event_writer: EventWriter<DamageEvent>, mut heal_event_writer: EventWriter<HealEvent>, ) { for (entity, state) in q.iter() { if let Some(damage) = state.get_damage() { damage_event_writer.send(DamageEvent { entity, damage }); } if let Some(heal) = state.get_heal() { heal_event_writer.send(HealEvent { entity, heal }); } } } ``` basic example after: ```rs import bevy::ecs::event::SendEventEx; fn my_func( mut commands: Commands, q: Query<(Entity, &State)>, ) { for (entity, state) in q.iter() { if let Some(damage) = state.get_damage() { commands.send_event(DamageEvent { entity, damage }); } if let Some(heal) = state.get_heal() { commands.send_event(HealEvent { entity, heal }); } } } ``` send/receive in the same system before: ```rs fn send_and_receive_param_set( mut param_set: ParamSet<(EventReader<DebugEvent>, EventWriter<DebugEvent>)>, ) { // We must collect the events to resend, because we can't access the writer while we're iterating over the reader. let mut events_to_resend = Vec::new(); // This is p0, as the first parameter in the `ParamSet` is the reader. for event in param_set.p0().read() { if event.resend_from_param_set { events_to_resend.push(event.clone()); } } // This is p1, as the second parameter in the `ParamSet` is the writer. for mut event in events_to_resend { event.times_sent += 1; param_set.p1().send(event); } } ``` after: ```rs use bevy::ecs::event::SendEventEx; fn send_via_commands_and_receive( mut reader: EventReader<DebugEvent>, mut commands: Commands, ) { for event in reader.read() { if event.resend_via_commands { commands.send_event(DebugEvent { times_sent: event.times_sent + 1, ..event.clone() }); } } } ``` --------- Co-authored-by: Jan Hohenheim <jan@hohenheim.ch>
- Loading branch information