diff --git a/crates/bevy_scene/src/lib.rs b/crates/bevy_scene/src/lib.rs index 7c35b9ba11fd3..9e1522ce8f8bb 100644 --- a/crates/bevy_scene/src/lib.rs +++ b/crates/bevy_scene/src/lib.rs @@ -29,6 +29,7 @@ impl Plugin for ScenePlugin { fn build(&self, app: &mut App) { app.add_asset::() .add_asset::() + .add_event::() .init_asset_loader::() .init_resource::() .add_system_to_stage( diff --git a/crates/bevy_scene/src/scene_spawner.rs b/crates/bevy_scene/src/scene_spawner.rs index bbab80a96ec84..aa35dbfd5c164 100644 --- a/crates/bevy_scene/src/scene_spawner.rs +++ b/crates/bevy_scene/src/scene_spawner.rs @@ -27,6 +27,11 @@ impl InstanceId { } } +#[derive(Debug)] +pub struct SceneSpawnedEvent { + pub instance_id: InstanceId, +} + #[derive(Default)] pub struct SceneSpawner { spawned_scenes: HashMap, Vec>, @@ -108,6 +113,10 @@ impl SceneSpawner { .entry(scene_handle.clone()) .or_insert_with(Vec::new); spawned.push(instance_id); + let mut scene_spawned_event_writer = world + .get_resource_mut::>() + .expect("SceneSpawnedEvent not found"); + scene_spawned_event_writer.send(SceneSpawnedEvent { instance_id }); Ok(()) } @@ -201,6 +210,11 @@ impl SceneSpawner { .entry(scene_handle) .or_insert_with(Vec::new); spawned.push(instance_id); + let mut scene_spawned_event_writer = world + .get_resource_mut::>() + .expect("SceneSpawnedEvent not found"); + scene_spawned_event_writer.send(SceneSpawnedEvent { instance_id }); + Ok(instance_id) }) } @@ -242,7 +256,7 @@ impl SceneSpawner { match self.spawn_dynamic_sync(world, &scene_handle) { Ok(_) => {} Err(SceneSpawnError::NonExistentScene { .. }) => { - self.dynamic_scenes_to_spawn.push(scene_handle) + self.dynamic_scenes_to_spawn.push(scene_handle); } Err(err) => return Err(err), } diff --git a/examples/scene/scene.rs b/examples/scene/scene.rs index b8f821489451a..b047f4dd85756 100644 --- a/examples/scene/scene.rs +++ b/examples/scene/scene.rs @@ -1,4 +1,4 @@ -use bevy::{prelude::*, reflect::TypeRegistry, utils::Duration}; +use bevy::{prelude::*, reflect::TypeRegistry, scene::SceneSpawnedEvent, utils::Duration}; /// This example illustrates loading and saving scenes from files fn main() { @@ -10,6 +10,7 @@ fn main() { .add_startup_system(load_scene_system) .add_startup_system(infotext_system) .add_system(log_system) + .add_system(scene_spawned_listener.system()) .run(); } @@ -121,3 +122,9 @@ fn infotext_system(mut commands: Commands, asset_server: Res) { ..Default::default() }); } + +fn scene_spawned_listener(mut events: EventReader) { + for event in events.iter() { + info!("{:?}", event); + } +}