@@ -67,9 +67,22 @@ impl<'w, E, B: Bundle> Trigger<'w, E, B> {
6767 Ptr :: from ( & self . event )
6868 }
6969
70- /// Returns the [`Entity`] that triggered the observer, could be [`Entity::PLACEHOLDER`].
71- pub fn entity ( & self ) -> Entity {
72- self . trigger . entity
70+ /// Returns the [`Entity`] that was targeted by the `event` that triggered this observer. It may
71+ /// be [`Entity::PLACEHOLDER`].
72+ ///
73+ /// Observable events can target specific entities. When those events fire, they will trigger
74+ /// any observers on the targeted entities. In this case, the `target()` and `observer()` are
75+ /// the same, because the observer that was triggered is attached to the entity that was
76+ /// targeted by the event.
77+ ///
78+ /// However, it is also possible for those events to bubble up the entity hierarchy and trigger
79+ /// observers on *different* entities, or trigger a global observer. In these cases, the
80+ /// observing entity is *different* from the entity being targeted by the event.
81+ ///
82+ /// This is an important distinction: the entity reacting to an event is not always the same as
83+ /// the entity triggered by the event.
84+ pub fn target ( & self ) -> Entity {
85+ self . trigger . target
7386 }
7487
7588 /// Returns the components that triggered the observer, out of the
@@ -207,7 +220,7 @@ pub struct ObserverTrigger {
207220 /// The [`ComponentId`]s the trigger targeted.
208221 components : SmallVec < [ ComponentId ; 2 ] > ,
209222 /// The entity the trigger targeted.
210- pub entity : Entity ,
223+ pub target : Entity ,
211224}
212225
213226impl ObserverTrigger {
@@ -277,7 +290,7 @@ impl Observers {
277290 pub ( crate ) fn invoke < T > (
278291 mut world : DeferredWorld ,
279292 event_type : ComponentId ,
280- entity : Entity ,
293+ target : Entity ,
281294 components : impl Iterator < Item = ComponentId > + Clone ,
282295 data : & mut T ,
283296 propagate : & mut bool ,
@@ -304,7 +317,7 @@ impl Observers {
304317 observer,
305318 event_type,
306319 components : components. clone ( ) . collect ( ) ,
307- entity ,
320+ target ,
308321 } ,
309322 data. into ( ) ,
310323 propagate,
@@ -314,8 +327,8 @@ impl Observers {
314327 observers. map . iter ( ) . for_each ( & mut trigger_observer) ;
315328
316329 // Trigger entity observers listening for this kind of trigger
317- if entity != Entity :: PLACEHOLDER {
318- if let Some ( map) = observers. entity_observers . get ( & entity ) {
330+ if target != Entity :: PLACEHOLDER {
331+ if let Some ( map) = observers. entity_observers . get ( & target ) {
319332 map. iter ( ) . for_each ( & mut trigger_observer) ;
320333 }
321334 }
@@ -328,8 +341,8 @@ impl Observers {
328341 . iter ( )
329342 . for_each ( & mut trigger_observer) ;
330343
331- if entity != Entity :: PLACEHOLDER {
332- if let Some ( map) = component_observers. entity_map . get ( & entity ) {
344+ if target != Entity :: PLACEHOLDER {
345+ if let Some ( map) = component_observers. entity_map . get ( & target ) {
333346 map. iter ( ) . for_each ( & mut trigger_observer) ;
334347 }
335348 }
@@ -733,20 +746,20 @@ mod tests {
733746 world. add_observer (
734747 |obs : Trigger < OnAdd , A > , mut res : ResMut < Order > , mut commands : Commands | {
735748 res. observed ( "add_a" ) ;
736- commands. entity ( obs. entity ( ) ) . insert ( B ) ;
749+ commands. entity ( obs. target ( ) ) . insert ( B ) ;
737750 } ,
738751 ) ;
739752 world. add_observer (
740753 |obs : Trigger < OnRemove , A > , mut res : ResMut < Order > , mut commands : Commands | {
741754 res. observed ( "remove_a" ) ;
742- commands. entity ( obs. entity ( ) ) . remove :: < B > ( ) ;
755+ commands. entity ( obs. target ( ) ) . remove :: < B > ( ) ;
743756 } ,
744757 ) ;
745758
746759 world. add_observer (
747760 |obs : Trigger < OnAdd , B > , mut res : ResMut < Order > , mut commands : Commands | {
748761 res. observed ( "add_b" ) ;
749- commands. entity ( obs. entity ( ) ) . remove :: < A > ( ) ;
762+ commands. entity ( obs. target ( ) ) . remove :: < A > ( ) ;
750763 } ,
751764 ) ;
752765 world. add_observer ( |_: Trigger < OnRemove , B > , mut res : ResMut < Order > | {
@@ -915,7 +928,7 @@ mod tests {
915928 . spawn_empty ( )
916929 . observe ( |_: Trigger < EventA > | panic ! ( "Trigger routed to non-targeted entity." ) ) ;
917930 world. add_observer ( move |obs : Trigger < EventA > , mut res : ResMut < Order > | {
918- assert_eq ! ( obs. entity ( ) , Entity :: PLACEHOLDER ) ;
931+ assert_eq ! ( obs. target ( ) , Entity :: PLACEHOLDER ) ;
919932 res. observed ( "event_a" ) ;
920933 } ) ;
921934
@@ -940,7 +953,7 @@ mod tests {
940953 . observe ( |_: Trigger < EventA > , mut res : ResMut < Order > | res. observed ( "a_1" ) )
941954 . id ( ) ;
942955 world. add_observer ( move |obs : Trigger < EventA > , mut res : ResMut < Order > | {
943- assert_eq ! ( obs. entity ( ) , entity) ;
956+ assert_eq ! ( obs. target ( ) , entity) ;
944957 res. observed ( "a_2" ) ;
945958 } ) ;
946959
@@ -1247,7 +1260,7 @@ mod tests {
12471260
12481261 world. add_observer (
12491262 |trigger : Trigger < EventPropagating > , query : Query < & A > , mut res : ResMut < Order > | {
1250- if query. get ( trigger. entity ( ) ) . is_ok ( ) {
1263+ if query. get ( trigger. target ( ) ) . is_ok ( ) {
12511264 res. observed ( "event" ) ;
12521265 }
12531266 } ,
0 commit comments