diff --git a/crates/bevy_scene/src/scene_spawner.rs b/crates/bevy_scene/src/scene_spawner.rs index 5a46aa14e256c..94abfccc39e15 100644 --- a/crates/bevy_scene/src/scene_spawner.rs +++ b/crates/bevy_scene/src/scene_spawner.rs @@ -8,7 +8,7 @@ use bevy_ecs::{ world::{Mut, World}, }; use bevy_hierarchy::{AddChild, Parent}; -use bevy_utils::{tracing::error, HashMap}; +use bevy_utils::{tracing::error, HashMap, HashSet}; use thiserror::Error; use uuid::Uuid; @@ -316,6 +316,26 @@ impl SceneSpawner { pub fn scene_spawner_system(world: &mut World) { world.resource_scope(|world, mut scene_spawner: Mut| { + // remove any loading instances where parent is deleted + let mut dead_instances = HashSet::default(); + scene_spawner + .scenes_with_parent + .retain(|(instance, parent)| { + let retain = world.get_entity(*parent).is_some(); + + if !retain { + dead_instances.insert(*instance); + } + + retain + }); + scene_spawner + .dynamic_scenes_to_spawn + .retain(|(_, instance)| !dead_instances.contains(instance)); + scene_spawner + .scenes_to_spawn + .retain(|(_, instance)| !dead_instances.contains(instance)); + let scene_asset_events = world.resource::>>(); let mut updated_spawned_scenes = Vec::new();