Struct bevy::ecs::event::Events

pub struct Events<E>
where E: Event,
{ /* private fields */ }
Expand description

An event collection that represents the events that occurred within the last two Events::update calls. Events can be written to using an EventWriter and are typically cheaply read using an EventReader.

Each event can be consumed by multiple systems, in parallel, with consumption tracked by the EventReader on a per-system basis.

If no ordering is applied between writing and reading systems, there is a risk of a race condition. This means that whether the events arrive before or after the next Events::update is unpredictable.

This collection is meant to be paired with a system that calls Events::update exactly once per update/frame.

event_update_system is a system that does this, typically initialized automatically using add_event. EventReaders are expected to read events from this collection at least once per loop/frame. Events will persist across a single frame boundary and so ordering of event producers and consumers is not critical (although poorly-planned ordering may cause accumulating lag). If events are not handled by the end of the frame after they are updated, they will be dropped silently.

§Example

use bevy_ecs::event::{Event, Events};

#[derive(Event)]
struct MyEvent {
    value: usize
}

// setup
let mut events = Events::<MyEvent>::default();
let mut reader = events.get_reader();

// run this once per update/frame
events.update();

// somewhere else: send an event
events.send(MyEvent { value: 1 });

// somewhere else: read the events
for event in reader.read(&events) {
    assert_eq!(event.value, 1)
}

// events are only processed once per reader
assert_eq!(reader.read(&events).count(), 0);

§Details

Events is implemented using a variation of a double buffer strategy. Each call to update swaps buffers and clears out the oldest one.

  • EventReaders will read events from both buffers.
  • EventReaders that read at least once per update will never drop events.
  • EventReaders that read once within two updates might still receive some events
  • EventReaders that read after two updates are guaranteed to drop all events that occurred before those updates.

The buffers in Events will grow indefinitely if update is never called.

An alternative call pattern would be to call update manually across frames to control when events are cleared. This complicates consumption and risks ever-expanding memory usage if not cleaned up, but can be done by adding your event as a resource instead of using add_event.

Example usage. Example usage standalone.

Implementations§

§

impl<E> Events<E>
where E: Event,

pub fn oldest_event_count(&self) -> usize

Returns the index of the oldest event stored in the event buffer.

pub fn send(&mut self, event: E) -> EventId<E>

“Sends” an event by writing it to the current event buffer. EventReaders can then read the event. This method returns the ID of the sent event.

Examples found in repository?
examples/ecs/send_and_receive_events.rs (line 165)
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
fn send_and_receive_manual_event_reader(
    // The `Local` `SystemParam` stores state inside the system itself, rather than in the world.
    // `ManualEventReader<T>` is the internal state of `EventReader<T>`, which tracks which events have been seen.
    mut local_event_reader: Local<ManualEventReader<DebugEvent>>,
    // We can access the `Events` resource mutably, allowing us to both read and write its contents.
    mut events: ResMut<Events<DebugEvent>>,
    frame_count: Res<FrameCount>,
) {
    println!(
        "Sending and receiving events for frame {} with a `Local<ManualEventReader>",
        frame_count.0
    );

    // We must collect the events to resend, because we can't mutate events while we're iterating over the events.
    let mut events_to_resend = Vec::new();

    for event in local_event_reader.read(&events) {
        if event.resend_from_local_event_reader {
            // For simplicity, we're cloning the event.
            // In this case, since we have mutable access to the `Events` resource,
            // we could also just mutate the event in-place,
            // or drain the event queue into our `events_to_resend` vector.
            events_to_resend.push(event.clone());
        }
    }

    for mut event in events_to_resend {
        event.times_sent += 1;
        events.send(event);
    }
}

pub fn send_batch( &mut self, events: impl IntoIterator<Item = E> ) -> SendBatchIds<E>

Sends a list of events all at once, which can later be read by EventReaders. This is more efficient than sending each event individually. This method returns the IDs of the sent events.

pub fn send_default(&mut self) -> EventId<E>
where E: Default,

Sends the default value of the event. Useful when the event is an empty struct. This method returns the ID of the sent event.

pub fn get_reader(&self) -> ManualEventReader<E>

Gets a new ManualEventReader. This will include all events already in the event buffers.

pub fn get_reader_current(&self) -> ManualEventReader<E>

Gets a new ManualEventReader. This will ignore all events already in the event buffers. It will read all future events.

pub fn update(&mut self)

Swaps the event buffers and clears the oldest event buffer. In general, this should be called once per frame/update.

If you need access to the events that were removed, consider using Events::update_drain.

pub fn update_drain(&mut self) -> impl Iterator<Item = E>

Swaps the event buffers and drains the oldest event buffer, returning an iterator of all events that were removed. In general, this should be called once per frame/update.

If you do not need to take ownership of the removed events, use Events::update instead.

pub fn clear(&mut self)

Removes all events.

pub fn len(&self) -> usize

Returns the number of events currently stored in the event buffer.

pub fn is_empty(&self) -> bool

Returns true if there are no events currently stored in the event buffer.

pub fn drain(&mut self) -> impl Iterator<Item = E>

Creates a draining iterator that removes all events.

pub fn iter_current_update_events(&self) -> impl ExactSizeIterator

Iterates over events that happened since the last “update” call. WARNING: You probably don’t want to use this call. In most cases you should use an EventReader. You should only use this if you know you only need to consume events between the last update() call and your call to iter_current_update_events. If events happen outside that window, they will not be handled. For example, any events that happen after this call and before the next update() call will be dropped.

pub fn get_event(&self, id: usize) -> Option<(&E, EventId<E>)>

Get a specific event by id if it still exists in the events buffer.

pub fn oldest_id(&self) -> usize

Oldest id still in the events buffer.

Trait Implementations§

§

impl<E> Debug for Events<E>
where E: Debug + Event,

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl<E> Default for Events<E>
where E: Event,

§

fn default() -> Events<E>

Returns the “default value” for a type. Read more
§

impl<E> Extend<E> for Events<E>
where E: Event,

§

fn extend<I>(&mut self, iter: I)
where I: IntoIterator<Item = E>,

Extends a collection with the contents of an iterator. Read more
source§

fn extend_one(&mut self, item: A)

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
§

impl<E> Resource for Events<E>
where E: Event, Events<E>: Send + Sync + 'static,

Auto Trait Implementations§

§

impl<E> Freeze for Events<E>

§

impl<E> RefUnwindSafe for Events<E>
where E: RefUnwindSafe,

§

impl<E> Send for Events<E>

§

impl<E> Sync for Events<E>

§

impl<E> Unpin for Events<E>
where E: Unpin,

§

impl<E> UnwindSafe for Events<E>
where E: UnwindSafe,

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T, U> AsBindGroupShaderType<U> for T
where U: ShaderType, &'a T: for<'a> Into<U>,

§

fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U

Return the T ShaderType for self. When used in AsBindGroup derives, it is safe to assume that all images in self exist.
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Downcast<T> for T

§

fn downcast(&self) -> &T

§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<S> FromSample<S> for S

§

fn from_sample_(s: S) -> S

§

impl<T> FromWorld for T
where T: Default,

§

fn from_world(_world: &mut World) -> T

Creates Self using data from the given World.
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> NoneValue for T
where T: Default,

§

type NoneType = T

§

fn null_value() -> T

The none-equivalent value.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<R, P> ReadPrimitive<R> for P
where R: Read + ReadEndian<P>, P: Default,

source§

fn read_from_little_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_little_endian().
source§

fn read_from_big_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_big_endian().
source§

fn read_from_native_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_native_endian().
source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, U> ToSample<U> for T
where U: FromSample<T>,

§

fn to_sample_(self) -> U

source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> Upcast<T> for T

§

fn upcast(&self) -> Option<&T>

§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
§

impl<T> ConditionalSend for T
where T: Send,

§

impl<S, T> Duplex<S> for T
where T: FromSample<S> + ToSample<S>,

§

impl<T> Settings for T
where T: 'static + Send + Sync,

§

impl<T> WasmNotSend for T
where T: Send,

§

impl<T> WasmNotSendSync for T
where T: WasmNotSend + WasmNotSync,

§

impl<T> WasmNotSync for T
where T: Sync,