bevyengine/bevy · error
Source entity must have ObservedBy
Error message
Source entity must have ObservedBy
What it means
Panic during deferred entity cloning (component_clone_observed_by): the source entity lacked the ObservedBy component, even though the clone path for observers assumes it is present. ObservedBy is inserted by the observer API when an observer watches the source, so its absence means the clone behavior ran for an entity that never had observers registered (or was already cleaned up).
Source
Thrown at crates/bevy_ecs/src/observer/entity_cloning.rs:35
if add_observers {
self.override_clone_behavior::<ObservedBy>(ComponentCloneBehavior::Custom(
component_clone_observed_by,
))
} else {
self.remove_clone_behavior_override::<ObservedBy>()
}
}
}
fn component_clone_observed_by(_source: &SourceComponent, ctx: &mut ComponentCloneCtx) {
let target = ctx.target();
let source = ctx.source();
ctx.queue_deferred(move |world: &mut World, _mapper: &mut dyn EntityMapper| {
let observed_by = world
.get::<ObservedBy>(source)
.map(|observed_by| observed_by.0.clone())
.expect("Source entity must have ObservedBy");
world
.entity_mut(target)
.insert(ObservedBy(observed_by.clone()));
for observer_entity in observed_by.iter().copied() {
let mut observer_state = world
.get_mut::<Observer>(observer_entity)
.expect("Source observer entity must have Observer");
observer_state.descriptor.entities.push(target);
let event_keys = observer_state.descriptor.event_keys.clone();
let components = observer_state.descriptor.components.clone();
for event_key in event_keys {
let observers = world.observers.get_observers_mut(event_key);
if components.is_empty() {
if let Some(map) = observers.entity_observers.get(&source).cloned() {
observers.entity_observers.insert(target, map);
}View on GitHub (pinned to 396ca72708)
Solutions
- Only enable the ObservedBy clone behavior (with_observed_by_cloning) for worlds where observers are attached via the normal API so ObservedBy stays consistent
- Avoid manually removing ObservedBy from observed entities
- Check world.get::<ObservedBy>(source) before invoking custom clone paths
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at crates/bevy_ecs/src/observer/entity_cloning.rs:35 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of bevyengine/bevy@396ca72708 (2026-08-20).
Data as JSON: /api/errors/7053d56e06fd35da.
Report an issue: GitHub.