diff --git a/crates/bevy_ecs/src/reflect/event.rs b/crates/bevy_ecs/src/reflect/event.rs index 322a6ef85895f..bddf3920c0b5c 100644 --- a/crates/bevy_ecs/src/reflect/event.rs +++ b/crates/bevy_ecs/src/reflect/event.rs @@ -5,7 +5,14 @@ //! //! Same as [`component`](`super::component`), but for events. -use crate::{event::Event, reflect::from_reflect_with_fallback, world::World}; +use alloc::boxed::Box; + +use crate::{ + event::Event, + observer::{Observer, On}, + reflect::from_reflect_with_fallback, + world::{DeferredWorld, World}, +}; use bevy_reflect::{FromReflect, FromType, PartialReflect, Reflect, TypePath, TypeRegistry}; /// A struct used to operate on reflected [`Event`] trait of a type. @@ -37,6 +44,8 @@ pub struct ReflectEvent(ReflectEventFns); pub struct ReflectEventFns { /// Function pointer implementing [`ReflectEvent::trigger`]. pub trigger: fn(&mut World, &dyn PartialReflect, &TypeRegistry), + /// Function pointer implementing [`ReflectEvent::create_observer`]. + pub create_observer: fn(Box) -> Observer, } impl ReflectEventFns { @@ -59,6 +68,14 @@ impl ReflectEvent { (self.0.trigger)(world, event, registry); } + /// Creates an [`Observer`] for this [`Event`] that calls the given callback. + pub fn create_observer( + &self, + callback: Box, + ) -> Observer { + (self.0.create_observer)(callback) + } + /// Create a custom implementation of [`ReflectEvent`]. /// /// This is an advanced feature, @@ -105,6 +122,11 @@ where let event = from_reflect_with_fallback::(reflected_event, world, registry); world.trigger(event); }, + create_observer: |callback| { + Observer::new(move |event: On, world: DeferredWorld| { + callback((*event).as_reflect(), world); + }) + }, }) } }