
# Objective - Some types are missing reflection attributes, which means we can't use them in scene serialization etc. - Effected types - `BorderRadius` - `AnimationTransitions` - `OnAdd` - `OnInsert` - `OnRemove` - My use-case for `OnAdd` etc to derive reflect is 'Serializable Observer Components'. Add the component, save the scene, then the observer is re-added on scene load. ```rust #[derive(Reflect)] struct MySerializeableObserver<T: Event>(#[reflect(ignore)]PhantomData<T>); impl<T: Event> Component for MySerializeableObserver<T> { const STORAGE_TYPE: StorageType = StorageType::Table; fn register_component_hooks(hooks: &mut ComponentHooks) { hooks.on_add(|mut world, entity, _| { world .commands() .entity(entity) .observe(|_trigger: Trigger<T>| { println!("it triggered etc."); }); }); } } ``` ## Solution - Add the missing traits ---
29 lines
979 B
Rust
29 lines
979 B
Rust
use super::*;
|
|
use crate::{self as bevy_ecs};
|
|
#[cfg(feature = "bevy_reflect")]
|
|
use bevy_reflect::Reflect;
|
|
/// Internal components used by bevy with a fixed component id.
|
|
/// Constants are used to skip [`TypeId`] lookups in hot paths.
|
|
|
|
/// [`ComponentId`] for [`OnAdd`]
|
|
pub const ON_ADD: ComponentId = ComponentId::new(0);
|
|
/// [`ComponentId`] for [`OnInsert`]
|
|
pub const ON_INSERT: ComponentId = ComponentId::new(1);
|
|
/// [`ComponentId`] for [`OnRemove`]
|
|
pub const ON_REMOVE: ComponentId = ComponentId::new(2);
|
|
|
|
/// Trigger emitted when a component is added to an entity.
|
|
#[derive(Event)]
|
|
#[cfg_attr(feature = "bevy_reflect", derive(Reflect))]
|
|
pub struct OnAdd;
|
|
|
|
/// Trigger emitted when a component is inserted on to to an entity.
|
|
#[derive(Event)]
|
|
#[cfg_attr(feature = "bevy_reflect", derive(Reflect))]
|
|
pub struct OnInsert;
|
|
|
|
/// Trigger emitted when a component is removed from an entity.
|
|
#[derive(Event)]
|
|
#[cfg_attr(feature = "bevy_reflect", derive(Reflect))]
|
|
pub struct OnRemove;
|