-
-
Notifications
You must be signed in to change notification settings - Fork 3.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add warning when a hierarchy component is missing
A common pitfall since 0.8 is the requirement on `ComputedVisibility` being present on all ancestors of an entity that itself has `ComputedVisibility`, without which, the entity becomes invisible. I myself hit the issue and got very confused, and saw a few people hit it as well, so it makes sense to provide a hint of what to do when such a situation is encountered. We now check that all entities with both a `Parent` and a `ComputedVisibility` component have parents that themselves have a `ComputedVisibility` component. Note that the warning is only printed once. We also add a similar warning to `GlobalTransform`. This only emits a warning. Because sometimes it could be an intended behavior. Alternatives: - Do nothing and keep repeating to newcomers how to avoid recurring pitfalls - Make the transform and visibility propagations tolerant to missing components
- Loading branch information
Showing
6 changed files
with
161 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
# B0004 | ||
|
||
A runtime warning. | ||
|
||
An [`Entity`] with a hierarchy-inherited component has a [`Parent`] | ||
without the hierarchy-inherited component in question. | ||
|
||
The hierarchy-inherited components are: | ||
|
||
- [`ComputedVisibility`] | ||
- [`GlobalTransform`] | ||
|
||
For example, the following code will cause a warning to be emitted: | ||
|
||
```rust,no_run | ||
use bevy::prelude::*; | ||
// WARNING: this code is buggy | ||
fn setup_cube( | ||
mut commands: Commands, | ||
mut meshes: ResMut<Assets<Mesh>>, | ||
mut materials: ResMut<Assets<StandardMaterial>>, | ||
) { | ||
commands | ||
.spawn_bundle(TransformBundle::default()) | ||
.with_children(|parent| { | ||
// cube | ||
parent.spawn_bundle(PbrBundle { | ||
mesh: meshes.add(Mesh::from(shape::Cube { size: 1.0 })), | ||
material: materials.add(Color::rgb(0.8, 0.7, 0.6).into()), | ||
transform: Transform::from_xyz(0.0, 0.5, 0.0), | ||
..default() | ||
}); | ||
}); | ||
// camera | ||
commands.spawn_bundle(Camera3dBundle { | ||
transform: Transform::from_xyz(-2.0, 2.5, 5.0).looking_at(Vec3::ZERO, Vec3::Y), | ||
..default() | ||
}); | ||
} | ||
fn main() { | ||
App::new() | ||
.add_plugins(DefaultPlugins) | ||
.add_startup_system(setup_cube) | ||
.run(); | ||
} | ||
``` | ||
|
||
This code **will not** show a cube on screen. | ||
This is because the entity spawned with `commands.spawn_bundle(…)` | ||
doesn't have a [`ComputedVisibility`] component. | ||
Since the cube is spawned as a child of an entity without the | ||
[`ComputedVisibility`] component, it will not be visible at all. | ||
|
||
To fix this, you must use [`SpatialBundle`] over [`TransformBundle`], | ||
as follow: | ||
|
||
|
||
```rust,no_run | ||
use bevy::prelude::*; | ||
fn setup_cube( | ||
mut commands: Commands, | ||
mut meshes: ResMut<Assets<Mesh>>, | ||
mut materials: ResMut<Assets<StandardMaterial>>, | ||
) { | ||
commands | ||
// We use SpatialBundle instead of TransformBundle, it contains the | ||
// ComputedVisibility component needed to display the cube, | ||
// In addition to the Transform and GlobalTransform components. | ||
.spawn_bundle(SpatialBundle::default()) | ||
.with_children(|parent| { | ||
// cube | ||
parent.spawn_bundle(PbrBundle { | ||
mesh: meshes.add(Mesh::from(shape::Cube { size: 1.0 })), | ||
material: materials.add(Color::rgb(0.8, 0.7, 0.6).into()), | ||
transform: Transform::from_xyz(0.0, 0.5, 0.0), | ||
..default() | ||
}); | ||
}); | ||
// camera | ||
commands.spawn_bundle(Camera3dBundle { | ||
transform: Transform::from_xyz(-2.0, 2.5, 5.0).looking_at(Vec3::ZERO, Vec3::Y), | ||
..default() | ||
}); | ||
} | ||
fn main() { | ||
App::new() | ||
.add_plugins(DefaultPlugins) | ||
.add_startup_system(setup_cube) | ||
.run(); | ||
} | ||
``` | ||
|
||
A similar problem occurs when the [`GlobalTransform`] component is missing. | ||
However, when a parent [`GlobalTransform`] is missing, | ||
it will simply prevent all transform propagation, | ||
including when updating the [`Transform`] component of the child. | ||
|
||
You will most likely encouter this warning when loading a scene | ||
as a child of a pre-existing [`Entity`] that does not have the proper components. | ||
|
||
[`ComputedVisibility`]: https://docs.rs/bevy/*/bevy/render/view/struct.ComputedVisibility.html | ||
[`GlobalTransform`]: https://docs.rs/bevy/*/bevy/transform/components/struct.GlobalTransform.html | ||
[`Transform`]: https://docs.rs/bevy/*/bevy/transform/components/struct.Transform.html | ||
[`Parent`]: https://docs.rs/bevy/*/bevy/hierarchy/struct.Parent.html | ||
[`Entity`]: https://docs.rs/bevy/*/bevy/ecs/entity/struct.Entity.html | ||
[`SpatialBundle`]: https://docs.rs/bevy/*/bevy/render/prelude/struct.SpatialBundle.html | ||
[`TransformBundle`]: https://docs.rs/bevy/*/bevy/transform/struct.TransformBundle.html |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters