bevyengine/bevy · error
Source observer entity must have Observer
Error message
Source observer entity must have Observer
What it means
Panic in the deferred part of component_clone_observed_by: while remapping observer entities that watch the source, world.get::<Observer>(observer_entity) returned None for an entry listed in ObservedBy. The ObservedBy list and the actual Observer components have desynchronized — an observer entity was despawned without its watchers entry being cleaned up.
Source
Thrown at crates/bevy_ecs/src/observer/entity_cloning.rs:44
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);
}
} else {
for component in &components {
let Some(observers) = observers.component_observers.get_mut(component)
else {
continue;
};
if let Some(map) =
observers.entity_component_observers.get(&source).cloned()
{View on GitHub (pinned to 396ca72708)
Solutions
- Let the observer API manage lifecycle so despawning an observer removes its ObservedBy entry
- Avoid manually despawning observer entities or stripping Observer components
- When cleaning up, remove both the Observer component and its registration on watched targets
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at crates/bevy_ecs/src/observer/entity_cloning.rs:44 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/38023213242d127d.
Report an issue: GitHub.