Send SceneInstanceReady only once per scene (#11002)
				
					
				
			# Objective Send `SceneInstanceReady` only once per scene. ## Solution I assume that this was not intentional. So I just changed it to only be sent once per scene. --- ## Changelog ### Fixed - Fixed `SceneInstanceReady` being emitted for every `Entity` in a scene.
This commit is contained in:
		
							parent
							
								
									9f7e61b819
								
							
						
					
					
						commit
						2fd5d4695e
					
				| @ -353,10 +353,10 @@ impl SceneSpawner { | |||||||
|                             child: entity, |                             child: entity, | ||||||
|                         } |                         } | ||||||
|                         .apply(world); |                         .apply(world); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
| 
 | 
 | ||||||
|                 world.send_event(SceneInstanceReady { parent }); |                 world.send_event(SceneInstanceReady { parent }); | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|             } else { |             } else { | ||||||
|                 self.scenes_with_parent.push((instance_id, parent)); |                 self.scenes_with_parent.push((instance_id, parent)); | ||||||
|             } |             } | ||||||
| @ -437,16 +437,22 @@ pub fn scene_spawner_system(world: &mut World) { | |||||||
| 
 | 
 | ||||||
| #[cfg(test)] | #[cfg(test)] | ||||||
| mod tests { | mod tests { | ||||||
|     use super::*; |     use bevy_app::App; | ||||||
|  |     use bevy_asset::{AssetPlugin, AssetServer}; | ||||||
|     use bevy_ecs::component::Component; |     use bevy_ecs::component::Component; | ||||||
|     use bevy_ecs::entity::Entity; |     use bevy_ecs::entity::Entity; | ||||||
|  |     use bevy_ecs::event::EventReader; | ||||||
|     use bevy_ecs::prelude::ReflectComponent; |     use bevy_ecs::prelude::ReflectComponent; | ||||||
|     use bevy_ecs::query::With; |     use bevy_ecs::query::With; | ||||||
|     use bevy_ecs::{reflect::AppTypeRegistry, world::World}; |     use bevy_ecs::reflect::AppTypeRegistry; | ||||||
| 
 |     use bevy_ecs::system::{Commands, Res, ResMut, RunSystemOnce}; | ||||||
|     use crate::DynamicSceneBuilder; |     use bevy_ecs::world::World; | ||||||
|     use bevy_reflect::Reflect; |     use bevy_reflect::Reflect; | ||||||
| 
 | 
 | ||||||
|  |     use crate::{DynamicScene, DynamicSceneBuilder, SceneInstanceReady, ScenePlugin, SceneSpawner}; | ||||||
|  | 
 | ||||||
|  |     use super::*; | ||||||
|  | 
 | ||||||
|     #[derive(Reflect, Component, Debug, PartialEq, Eq, Clone, Copy, Default)] |     #[derive(Reflect, Component, Debug, PartialEq, Eq, Clone, Copy, Default)] | ||||||
|     #[reflect(Component)] |     #[reflect(Component)] | ||||||
|     struct A(usize); |     struct A(usize); | ||||||
| @ -497,4 +503,51 @@ mod tests { | |||||||
|             .unwrap(); |             .unwrap(); | ||||||
|         assert_eq!(old_a, new_a); |         assert_eq!(old_a, new_a); | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     #[derive(Component, Reflect, Default)] | ||||||
|  |     #[reflect(Component)] | ||||||
|  |     struct ComponentA; | ||||||
|  | 
 | ||||||
|  |     #[test] | ||||||
|  |     fn event() { | ||||||
|  |         let mut app = App::new(); | ||||||
|  |         app.add_plugins((AssetPlugin::default(), ScenePlugin)); | ||||||
|  | 
 | ||||||
|  |         app.register_type::<ComponentA>(); | ||||||
|  |         app.world.spawn(ComponentA); | ||||||
|  |         app.world.spawn(ComponentA); | ||||||
|  | 
 | ||||||
|  |         // Build scene.
 | ||||||
|  |         let scene = | ||||||
|  |             app.world | ||||||
|  |                 .run_system_once(|world: &World, asset_server: Res<'_, AssetServer>| { | ||||||
|  |                     asset_server.add(DynamicScene::from_world(world)) | ||||||
|  |                 }); | ||||||
|  | 
 | ||||||
|  |         // Spawn scene.
 | ||||||
|  |         let scene_entity = app.world.run_system_once( | ||||||
|  |             move |mut commands: Commands<'_, '_>, mut scene_spawner: ResMut<'_, SceneSpawner>| { | ||||||
|  |                 let scene_entity = commands.spawn_empty().id(); | ||||||
|  |                 scene_spawner.spawn_dynamic_as_child(scene.clone(), scene_entity); | ||||||
|  |                 scene_entity | ||||||
|  |             }, | ||||||
|  |         ); | ||||||
|  | 
 | ||||||
|  |         // Check for event arrival.
 | ||||||
|  |         app.update(); | ||||||
|  |         app.world.run_system_once( | ||||||
|  |             move |mut ev_scene: EventReader<'_, '_, SceneInstanceReady>| { | ||||||
|  |                 let mut events = ev_scene.read(); | ||||||
|  | 
 | ||||||
|  |                 assert_eq!( | ||||||
|  |                     events.next().expect("found no `SceneInstanceReady` event"), | ||||||
|  |                     &SceneInstanceReady { | ||||||
|  |                         parent: scene_entity | ||||||
|  |                     }, | ||||||
|  |                     "`SceneInstanceReady` contains the wrong parent entity" | ||||||
|  |                 ); | ||||||
|  |                 assert!(events.next().is_none(), "found more than one event"); | ||||||
|  |             }, | ||||||
|  |         ); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 daxpedda
						daxpedda