
# Objective A step in the migration to required components: scenes! ## Solution As per the [selected proposal](https://hackmd.io/@bevy/required_components/%2FPJtNGVMMQhyM0zIvCJSkbA): - Deprecate `SceneBundle` and `DynamicSceneBundle`. - Add `SceneRoot` and `DynamicSceneRoot` components, which wrap a `Handle<Scene>` and `Handle<DynamicScene>` respectively. ## Migration Guide Asset handles for scenes and dynamic scenes must now be wrapped in the `SceneRoot` and `DynamicSceneRoot` components. Raw handles as components no longer spawn scenes. Additionally, `SceneBundle` and `DynamicSceneBundle` have been deprecated. Instead, use the scene components directly. Previously: ```rust let model_scene = asset_server.load(GltfAssetLabel::Scene(0).from_asset("model.gltf")); commands.spawn(SceneBundle { scene: model_scene, transform: Transform::from_xyz(-4.0, 0.0, -3.0), ..default() }); ``` Now: ```rust let model_scene = asset_server.load(GltfAssetLabel::Scene(0).from_asset("model.gltf")); commands.spawn(( SceneRoot(model_scene), Transform::from_xyz(-4.0, 0.0, -3.0), )); ```
37 lines
1.3 KiB
Rust
37 lines
1.3 KiB
Rust
use bevy_asset::Handle;
|
|
use bevy_derive::{Deref, DerefMut};
|
|
use bevy_ecs::component::Component;
|
|
use bevy_reflect::Reflect;
|
|
use bevy_transform::components::Transform;
|
|
|
|
#[cfg(feature = "bevy_render")]
|
|
use bevy_render::view::visibility::Visibility;
|
|
|
|
use crate::{DynamicScene, Scene};
|
|
|
|
/// Adding this component will spawn the scene as a child of that entity.
|
|
/// Once it's spawned, the entity will have a [`SceneInstance`](crate::SceneInstance) component.
|
|
#[derive(Component, Clone, Debug, Default, Deref, DerefMut, Reflect, PartialEq, Eq)]
|
|
#[require(Transform)]
|
|
#[cfg_attr(feature = "bevy_render", require(Visibility))]
|
|
pub struct SceneRoot(pub Handle<Scene>);
|
|
|
|
impl From<Handle<Scene>> for SceneRoot {
|
|
fn from(handle: Handle<Scene>) -> Self {
|
|
Self(handle)
|
|
}
|
|
}
|
|
|
|
/// Adding this component will spawn the scene as a child of that entity.
|
|
/// Once it's spawned, the entity will have a [`SceneInstance`](crate::SceneInstance) component.
|
|
#[derive(Component, Clone, Debug, Default, Deref, DerefMut, Reflect, PartialEq, Eq)]
|
|
#[require(Transform)]
|
|
#[cfg_attr(feature = "bevy_render", require(Visibility))]
|
|
pub struct DynamicSceneRoot(pub Handle<DynamicScene>);
|
|
|
|
impl From<Handle<DynamicScene>> for DynamicSceneRoot {
|
|
fn from(handle: Handle<DynamicScene>) -> Self {
|
|
Self(handle)
|
|
}
|
|
}
|