diff --git a/crates/bevy_hierarchy/src/hierarchy.rs b/crates/bevy_hierarchy/src/hierarchy.rs index d16ebd1904188..32c2f788d63aa 100644 --- a/crates/bevy_hierarchy/src/hierarchy.rs +++ b/crates/bevy_hierarchy/src/hierarchy.rs @@ -86,7 +86,7 @@ pub trait DespawnRecursiveExt { fn despawn_recursive(self); /// Despawns all descendants of the given entity. - fn despawn_descendants(&mut self); + fn despawn_descendants(&mut self) -> &mut Self; } impl<'w, 's, 'a> DespawnRecursiveExt for EntityCommands<'w, 's, 'a> { @@ -96,9 +96,10 @@ impl<'w, 's, 'a> DespawnRecursiveExt for EntityCommands<'w, 's, 'a> { self.commands().add(DespawnRecursive { entity }); } - fn despawn_descendants(&mut self) { + fn despawn_descendants(&mut self) -> &mut Self { let entity = self.id(); self.commands().add(DespawnChildrenRecursive { entity }); + self } } @@ -117,7 +118,7 @@ impl<'w> DespawnRecursiveExt for EntityMut<'w> { despawn_with_children_recursive(self.into_world_mut(), entity); } - fn despawn_descendants(&mut self) { + fn despawn_descendants(&mut self) -> &mut Self { let entity = self.id(); #[cfg(feature = "trace")] @@ -130,6 +131,7 @@ impl<'w> DespawnRecursiveExt for EntityMut<'w> { self.world_scope(|world| { despawn_children_recursive(world, entity); }); + self } } @@ -246,4 +248,32 @@ mod tests { // The child should be despawned. assert!(world.get_entity(child).is_none()); } + + #[test] + fn spawn_children_after_despawn_descendants() { + let mut world = World::default(); + let mut queue = CommandQueue::default(); + let mut commands = Commands::new(&mut queue, &world); + + let parent = commands.spawn_empty().id(); + let child = commands.spawn_empty().id(); + + commands + .entity(parent) + .add_child(child) + .despawn_descendants() + .with_children(|parent| { + parent.spawn_empty(); + parent.spawn_empty(); + }); + + queue.apply(&mut world); + + // The parent's Children component should still have two children. + let children = world.entity(parent).get::(); + assert!(children.is_some()); + assert!(children.unwrap().len() == 2_usize); + // The original child should be despawned. + assert!(world.get_entity(child).is_none()); + } }