From 85e41ddaced1dec943c4f5fc3cbad858ac6e94ac Mon Sep 17 00:00:00 2001 From: Zachary Harrold Date: Tue, 10 Sep 2024 02:23:14 +1000 Subject: [PATCH] Add `observer` to `Trigger` (#15066) # Objective - Fixes #15061 ## Solution - Added `observer` to `Trigger`, which returns the entity observing the triggered event. ## Testing - CI passed locally. --- crates/bevy_ecs/src/observer/mod.rs | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/crates/bevy_ecs/src/observer/mod.rs b/crates/bevy_ecs/src/observer/mod.rs index 4711957af9..2571157302 100644 --- a/crates/bevy_ecs/src/observer/mod.rs +++ b/crates/bevy_ecs/src/observer/mod.rs @@ -56,11 +56,37 @@ impl<'w, E, B: Bundle> Trigger<'w, E, B> { Ptr::from(&self.event) } - /// Returns the entity that triggered the observer, could be [`Entity::PLACEHOLDER`]. + /// Returns the [`Entity`] that triggered the observer, could be [`Entity::PLACEHOLDER`]. pub fn entity(&self) -> Entity { self.trigger.entity } + /// Returns the [`Entity`] that observed the triggered event. + /// This allows you to despawn the observer, ceasing observation. + /// + /// # Examples + /// + /// ```rust + /// # use bevy_ecs::prelude::{Commands, Trigger}; + /// # + /// # struct MyEvent { + /// # done: bool, + /// # } + /// # + /// /// Handle `MyEvent` and if it is done, stop observation. + /// fn my_observer(trigger: Trigger, mut commands: Commands) { + /// if trigger.event().done { + /// commands.entity(trigger.observer()).despawn(); + /// return; + /// } + /// + /// // ... + /// } + /// ``` + pub fn observer(&self) -> Entity { + self.trigger.observer + } + /// Enables or disables event propagation, allowing the same event to trigger observers on a chain of different entities. /// /// The path an event will propagate along is specified by its associated [`Traversal`] component. By default, events