Skip to content

Commit 62ba0c6

Browse files
committed
some kind of signaling
1 parent 1c22c75 commit 62ba0c6

File tree

2 files changed

+41
-7
lines changed

2 files changed

+41
-7
lines changed

crates/bevy_app/src/app.rs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
use crate::{FixedUpdate, Main, MainSchedulePlugin, Plugin, Plugins, StateTransition};
1+
use crate::{First, FixedUpdate, Main, MainSchedulePlugin, Plugin, Plugins, StateTransition};
22
pub use bevy_derive::AppLabel;
33
use bevy_ecs::{
4+
event::EventUpdateSignal,
45
prelude::*,
56
schedule::{
67
apply_state_transition, common_conditions::run_once as run_once_condition,
@@ -485,11 +486,18 @@ impl App {
485486
T: Event,
486487
{
487488
if !self.world.contains_resource::<Events<T>>() {
488-
self.init_resource::<Events<T>>().add_systems(
489-
FixedUpdate,
490-
bevy_ecs::event::event_update_system::<T>
491-
.run_if(bevy_ecs::event::event_update_condition::<T>),
492-
);
489+
self.init_resource::<Events<T>>()
490+
.init_resource::<EventUpdateSignal<T>>()
491+
.add_systems(
492+
First,
493+
bevy_ecs::event::event_update_system::<T>
494+
.run_if(bevy_ecs::event::event_update_condition::<T>),
495+
)
496+
.add_systems(
497+
FixedUpdate,
498+
bevy_ecs::event::event_queue_update_system::<T>
499+
.run_if(bevy_ecs::event::event_update_condition::<T>),
500+
);
493501
}
494502
self
495503
}

crates/bevy_ecs/src/event.rs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -749,8 +749,34 @@ impl<'a, E: Event> ExactSizeIterator for EventIteratorWithId<'a, E> {
749749
}
750750
}
751751

752+
#[doc(hidden)]
753+
#[derive(Resource)]
754+
pub struct EventUpdateSignal<T>(bool, PhantomData<T>);
755+
756+
impl<T> Default for EventUpdateSignal<T> {
757+
fn default() -> Self {
758+
Self(false, PhantomData)
759+
}
760+
}
761+
762+
/// A system that queues a call to [`Events::update`].
763+
pub fn event_queue_update_system<T: Event>(signal: Option<ResMut<EventUpdateSignal<T>>>) {
764+
if let Some(mut s) = signal {
765+
s.0 = true;
766+
}
767+
}
768+
752769
/// A system that calls [`Events::update`].
753-
pub fn event_update_system<T: Event>(mut events: ResMut<Events<T>>) {
770+
pub fn event_update_system<T: Event>(
771+
signal: Option<ResMut<EventUpdateSignal<T>>>,
772+
mut events: ResMut<Events<T>>,
773+
) {
774+
if let Some(mut s) = signal {
775+
if !std::mem::replace(&mut s.0, false) {
776+
return;
777+
}
778+
}
779+
754780
events.update();
755781
}
756782

0 commit comments

Comments
 (0)