
# Objective - Spawning a scene is handled as a special case with a command `spawn_scene` that takes an handle but doesn't let you specify anything else. This is the only handle that works that way. - Workaround for this have been to add the `spawn_scene` on `ChildBuilder` to be able to specify transform of parent, or to make the `SceneSpawner` available to be able to select entities from a scene by their instance id ## Solution Add a bundle ```rust pub struct SceneBundle { pub scene: Handle<Scene>, pub transform: Transform, pub global_transform: GlobalTransform, pub instance_id: Option<InstanceId>, } ``` and instead of ```rust commands.spawn_scene(asset_server.load("models/FlightHelmet/FlightHelmet.gltf#Scene0")); ``` you can do ```rust commands.spawn_bundle(SceneBundle { scene: asset_server.load("models/FlightHelmet/FlightHelmet.gltf#Scene0"), ..Default::default() }); ``` The scene will be spawned as a child of the entity with the `SceneBundle` ~I would like to remove the command `spawn_scene` in favor of this bundle but didn't do it yet to get feedback first~ Co-authored-by: François <8672791+mockersf@users.noreply.github.com> Co-authored-by: Carter Anderson <mcanders1@gmail.com>
40 lines
1.0 KiB
Rust
40 lines
1.0 KiB
Rust
mod bundle;
|
|
mod dynamic_scene;
|
|
mod scene;
|
|
mod scene_loader;
|
|
mod scene_spawner;
|
|
pub mod serde;
|
|
|
|
pub use bundle::*;
|
|
pub use dynamic_scene::*;
|
|
pub use scene::*;
|
|
pub use scene_loader::*;
|
|
pub use scene_spawner::*;
|
|
|
|
pub mod prelude {
|
|
#[doc(hidden)]
|
|
pub use crate::{DynamicScene, DynamicSceneBundle, Scene, SceneBundle, SceneSpawner};
|
|
}
|
|
|
|
use bevy_app::prelude::*;
|
|
use bevy_asset::AddAsset;
|
|
use bevy_ecs::{schedule::ExclusiveSystemDescriptorCoercion, system::IntoExclusiveSystem};
|
|
|
|
#[derive(Default)]
|
|
pub struct ScenePlugin;
|
|
|
|
impl Plugin for ScenePlugin {
|
|
fn build(&self, app: &mut App) {
|
|
app.add_asset::<DynamicScene>()
|
|
.add_asset::<Scene>()
|
|
.init_asset_loader::<SceneLoader>()
|
|
.init_resource::<SceneSpawner>()
|
|
.add_system_to_stage(
|
|
CoreStage::PreUpdate,
|
|
scene_spawner_system.exclusive_system().at_end(),
|
|
)
|
|
// Systems `*_bundle_spawner` must run before `scene_spawner_system`
|
|
.add_system_to_stage(CoreStage::PreUpdate, scene_spawner);
|
|
}
|
|
}
|