Struct PopulatedMessageReader
pub struct PopulatedMessageReader<'w, 's, M>(/* private fields */)
where
M: Message;Expand description
Reads Messages of type T in order and tracks which messages have already been read.
Skips the system if there no messages.
Use MessageReader<T> to run the system even if there are no messages.
Use the on_message run condition to skip the system based on messages that it doesn’t read.
Methods from Deref<Target = MessageReader<'w, 's, M>>§
pub fn read(&mut self) -> MessageIterator<'_, M>
pub fn read(&mut self) -> MessageIterator<'_, M>
Iterates over the messages this MessageReader has not seen yet. This updates the
MessageReader’s message counter, which means subsequent message reads will not include messages
that happened before now.
pub fn read_with_id(&mut self) -> MessageIteratorWithId<'_, M>
pub fn read_with_id(&mut self) -> MessageIteratorWithId<'_, M>
pub fn par_read(&mut self) -> MessageParIter<'_, M>
pub fn par_read(&mut self) -> MessageParIter<'_, M>
Returns a parallel iterator over the messages this MessageReader has not seen yet.
See also for_each.
§Example
#[derive(Message)]
struct MyMessage {
value: usize,
}
#[derive(Resource, Default)]
struct Counter(AtomicUsize);
// setup
let mut world = World::new();
world.init_resource::<Messages<MyMessage>>();
world.insert_resource(Counter::default());
let mut schedule = Schedule::default();
schedule.add_systems(|mut messages: MessageReader<MyMessage>, counter: Res<Counter>| {
messages.par_read().for_each(|MyMessage { value }| {
counter.0.fetch_add(*value, Ordering::Relaxed);
});
});
for value in 0..100 {
world.write_message(MyMessage { value });
}
schedule.run(&mut world);
let Counter(counter) = world.remove_resource::<Counter>().unwrap();
// all messages were processed
assert_eq!(counter.into_inner(), 4950);pub fn len(&self) -> usize
pub fn len(&self) -> usize
Determines the number of messages available to be read from this MessageReader without consuming any.
pub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Returns true if there are no messages available to read.
§Example
The following example shows a useful pattern where some behavior is triggered if new messages are available.
MessageReader::clear() is used so the same messages don’t re-trigger the behavior the next time the system runs.
#[derive(Message)]
struct Collision;
fn play_collision_sound(mut messages: MessageReader<Collision>) {
if !messages.is_empty() {
messages.clear();
// Play a sound
}
}pub fn clear(&mut self)
pub fn clear(&mut self)
Consumes all available messages.
This means these messages will not appear in calls to MessageReader::read() or
MessageReader::read_with_id() and MessageReader::is_empty() will return true.
For usage, see MessageReader::is_empty().
Trait Implementations§
§impl<'w, 's, M> Debug for PopulatedMessageReader<'w, 's, M>
impl<'w, 's, M> Debug for PopulatedMessageReader<'w, 's, M>
§impl<'w, 's, M> Deref for PopulatedMessageReader<'w, 's, M>where
M: Message,
impl<'w, 's, M> Deref for PopulatedMessageReader<'w, 's, M>where
M: Message,
§type Target = MessageReader<'w, 's, M>
type Target = MessageReader<'w, 's, M>
§fn deref(&self) -> &<PopulatedMessageReader<'w, 's, M> as Deref>::Target
fn deref(&self) -> &<PopulatedMessageReader<'w, 's, M> as Deref>::Target
§impl<'w, 's, M> DerefMut for PopulatedMessageReader<'w, 's, M>where
M: Message,
impl<'w, 's, M> DerefMut for PopulatedMessageReader<'w, 's, M>where
M: Message,
§fn deref_mut(
&mut self,
) -> &mut <PopulatedMessageReader<'w, 's, M> as Deref>::Target
fn deref_mut( &mut self, ) -> &mut <PopulatedMessageReader<'w, 's, M> as Deref>::Target
§impl<'w, 's, M> SystemParam for PopulatedMessageReader<'w, 's, M>where
M: Message,
impl<'w, 's, M> SystemParam for PopulatedMessageReader<'w, 's, M>where
M: Message,
§type State = <MessageReader<'w, 's, M> as SystemParam>::State
type State = <MessageReader<'w, 's, M> as SystemParam>::State
§type Item<'world, 'state> = PopulatedMessageReader<'world, 'state, M>
type Item<'world, 'state> = PopulatedMessageReader<'world, 'state, M>
Self, instantiated with new lifetimes. Read more§fn init_state(
world: &mut World,
) -> <PopulatedMessageReader<'w, 's, M> as SystemParam>::State
fn init_state( world: &mut World, ) -> <PopulatedMessageReader<'w, 's, M> as SystemParam>::State
State.§fn init_access(
state: &<PopulatedMessageReader<'w, 's, M> as SystemParam>::State,
system_meta: &mut SystemMeta,
component_access_set: &mut FilteredAccessSet,
world: &mut World,
)
fn init_access( state: &<PopulatedMessageReader<'w, 's, M> as SystemParam>::State, system_meta: &mut SystemMeta, component_access_set: &mut FilteredAccessSet, world: &mut World, )
§unsafe fn get_param<'world, 'state>(
state: &'state mut <PopulatedMessageReader<'w, 's, M> as SystemParam>::State,
system_meta: &SystemMeta,
world: UnsafeWorldCell<'world>,
change_tick: Tick,
) -> Result<<PopulatedMessageReader<'w, 's, M> as SystemParam>::Item<'world, 'state>, SystemParamValidationError>
unsafe fn get_param<'world, 'state>( state: &'state mut <PopulatedMessageReader<'w, 's, M> as SystemParam>::State, system_meta: &SystemMeta, world: UnsafeWorldCell<'world>, change_tick: Tick, ) -> Result<<PopulatedMessageReader<'w, 's, M> as SystemParam>::Item<'world, 'state>, SystemParamValidationError>
SystemParamFunction. Read more§fn apply(state: &mut Self::State, system_meta: &SystemMeta, world: &mut World)
fn apply(state: &mut Self::State, system_meta: &SystemMeta, world: &mut World)
SystemParam]’s state.
This is used to apply Commands during ApplyDeferred.§fn queue(
state: &mut Self::State,
system_meta: &SystemMeta,
world: DeferredWorld<'_>,
)
fn queue( state: &mut Self::State, system_meta: &SystemMeta, world: DeferredWorld<'_>, )
ApplyDeferred.