use bevy::{prelude::*, scene::InstanceId}; fn main() { App::build() .insert_resource(Msaa { samples: 4 }) .add_plugins(DefaultPlugins) .insert_resource(SceneInstance::default()) .add_startup_system(setup.system()) .add_system(scene_update.system()) .add_system(move_scene_entities.system()) .run(); } // Resource to hold the scene `instance_id` until it is loaded #[derive(Default)] struct SceneInstance(Option); // Component that will be used to tag entities in the scene struct EntityInMyScene; fn setup( commands: &mut Commands, asset_server: Res, mut scene_spawner: ResMut, mut scene_instance: ResMut, ) { commands .spawn(LightBundle { transform: Transform::from_xyz(4.0, 5.0, 4.0), ..Default::default() }) .spawn(PerspectiveCameraBundle { transform: Transform::from_xyz(1.05, 0.9, 1.5) .looking_at(Vec3::new(0.0, 0.3, 0.0), Vec3::unit_y()), ..Default::default() }); // Spawn the scene as a child of another entity. This first scene will be translated backward // with its parent commands .spawn(( Transform::from_xyz(0.0, 0.0, -1.0), GlobalTransform::default(), )) .with_children(|parent| { parent.spawn_scene(asset_server.load("models/FlightHelmet/FlightHelmet.gltf#Scene0")); }); // Spawn a second scene, and keep its `instance_id` let instance_id = scene_spawner.spawn(asset_server.load("models/FlightHelmet/FlightHelmet.gltf#Scene0")); scene_instance.0 = Some(instance_id); } // This system will wait for the scene to be ready, and then tag entities from // the scene with `EntityInMyScene`. All entities from the second scene will be // tagged fn scene_update( commands: &mut Commands, scene_spawner: Res, scene_instance: Res, mut done: Local, ) { if !*done { if let Some(instance_id) = scene_instance.0 { if let Some(entity_iter) = scene_spawner.iter_instance_entities(instance_id) { entity_iter.for_each(|entity| { commands.insert_one(entity, EntityInMyScene); }); *done = true; } } } } // This system will move all entities with component `EntityInMyScene`, so all // entities from the second scene fn move_scene_entities( time: Res