Struct MessageReader
pub struct MessageReader<'w, 's, M>where
M: Message,{ /* private fields */ }Expand description
Reads Messages of type T in order and tracks which messages have already been read.
Use PopulatedMessageReader<T> to skip the system if there are no messages.
§Usage
#[derive(Message)]
pub struct MyMessage(String); // Custom message type.
fn my_system(mut reader: MessageReader<MyMessage>) {
for msg in reader.read() {
println!("{}", msg.0)
}
}
§Concurrency
Unlike MessageWriter<T>, systems with MessageReader<T> param can be executed concurrently
(but not concurrently with MessageWriter<T> or MessageMutator<T> systems for the same message type).
Implementations§
§impl<'w, 's, M> MessageReader<'w, 's, M>where
M: Message,
impl<'w, 's, M> MessageReader<'w, 's, M>where
M: Message,
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 MessageReader<'w, 's, M>
impl<'w, 's, M> Debug for MessageReader<'w, 's, M>
§impl<M> SystemParam for MessageReader<'_, '_, M>where
M: Message,
impl<M> SystemParam for MessageReader<'_, '_, M>where
M: Message,
§type Item<'w, 's> = MessageReader<'w, 's, M>
type Item<'w, 's> = MessageReader<'w, 's, M>
Self, instantiated with new lifetimes. Read more§fn init_state(
world: &mut World,
) -> <MessageReader<'_, '_, M> as SystemParam>::State
fn init_state( world: &mut World, ) -> <MessageReader<'_, '_, M> as SystemParam>::State
State.§fn init_access(
state: &<MessageReader<'_, '_, M> as SystemParam>::State,
system_meta: &mut SystemMeta,
component_access_set: &mut FilteredAccessSet,
world: &mut World,
)
fn init_access( state: &<MessageReader<'_, '_, M> as SystemParam>::State, system_meta: &mut SystemMeta, component_access_set: &mut FilteredAccessSet, world: &mut World, )
§fn apply(
state: &mut <MessageReader<'_, '_, M> as SystemParam>::State,
system_meta: &SystemMeta,
world: &mut World,
)
fn apply( state: &mut <MessageReader<'_, '_, M> as SystemParam>::State, system_meta: &SystemMeta, world: &mut World, )
SystemParam]’s state.
This is used to apply Commands during ApplyDeferred.§fn queue(
state: &mut <MessageReader<'_, '_, M> as SystemParam>::State,
system_meta: &SystemMeta,
world: DeferredWorld<'_>,
)
fn queue( state: &mut <MessageReader<'_, '_, M> as SystemParam>::State, system_meta: &SystemMeta, world: DeferredWorld<'_>, )
ApplyDeferred.§unsafe fn get_param<'w, 's>(
state: &'s mut <MessageReader<'_, '_, M> as SystemParam>::State,
system_meta: &SystemMeta,
world: UnsafeWorldCell<'w>,
change_tick: Tick,
) -> Result<<MessageReader<'_, '_, M> as SystemParam>::Item<'w, 's>, SystemParamValidationError>
unsafe fn get_param<'w, 's>( state: &'s mut <MessageReader<'_, '_, M> as SystemParam>::State, system_meta: &SystemMeta, world: UnsafeWorldCell<'w>, change_tick: Tick, ) -> Result<<MessageReader<'_, '_, M> as SystemParam>::Item<'w, 's>, SystemParamValidationError>
SystemParamFunction. Read more