bevy/errors/B0004.md
Carter Anderson ba5e71f53d
Parent -> ChildOf (#17427)
Fixes #17412

## Objective

`Parent` uses the "has a X" naming convention. There is increasing
sentiment that we should use the "is a X" naming convention for
relationships (following #17398). This leaves `Children` as-is because
there is prevailing sentiment that `Children` is clearer than `ParentOf`
in many cases (especially when treating it like a collection).

This renames `Parent` to `ChildOf`.

This is just the implementation PR. To discuss the path forward, do so
in #17412.

## Migration Guide

- The `Parent` component has been renamed to `ChildOf`.
2025-01-20 22:13:29 +00:00

113 lines
3.5 KiB
Markdown

# B0004
A runtime warning.
An [`Entity`] with a hierarchy-inherited component has a [`ChildOf`]
without the hierarchy-inherited component in question.
The hierarchy-inherited components defined in bevy include:
- [`InheritedVisibility`]
- [`GlobalTransform`]
Third party plugins may also define their own hierarchy components, so
read the warning message carefully and pay attention to the exact type
of the missing component.
To fix this warning, add the missing hierarchy component to all ancestors
of entities with the hierarchy component you wish to use.
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(Transform::default())
.with_children(|parent| {
// cube
parent.spawn((
Mesh3d(meshes.add(Cuboid::default())),
MeshMaterial3d(materials.add(Color::srgb(0.8, 0.7, 0.6))),
Transform::from_xyz(0.0, 0.5, 0.0),
));
});
// camera
commands.spawn((
Camera3d::default(),
Transform::from_xyz(-2.0, 2.5, 5.0).looking_at(Vec3::ZERO, Vec3::Y),
));
}
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.add_systems(Startup, setup_cube)
.run();
}
```
This code **will not** show a cube on screen.
This is because the entity spawned with `commands.spawn(…)`
doesn't have a [`ViewVisibility`] or [`InheritedVisibility`] component.
Since the cube is spawned as a child of an entity without the
visibility components, it will not be visible at all.
To fix this, you must also add a [`Visibility`] component.
It automatically adds the other relevant visibility components for you:
```rust,no_run
use bevy::prelude::*;
fn setup_cube(
mut commands: Commands,
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<StandardMaterial>>,
) {
commands
.spawn((Transform::default(), Visibility::default()))
.with_children(|parent| {
// cube
parent.spawn((
Mesh3d(meshes.add(Cuboid::default())),
MeshMaterial3d(materials.add(Color::srgb(0.8, 0.7, 0.6))),
Transform::from_xyz(0.0, 0.5, 0.0),
));
});
// camera
commands.spawn((
Camera3d::default(),
Transform::from_xyz(-2.0, 2.5, 5.0).looking_at(Vec3::ZERO, Vec3::Y),
));
}
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.add_systems(Startup, setup_cube)
.run();
}
```
A similar problem occurs when the [`GlobalTransform`] component is missing.
However, it will be automatically inserted whenever `Transform` is
inserted, as it is a required component.
You will most likely encounter this warning when loading a scene
as a child of a pre-existing [`Entity`] that does not have the proper components.
[`InheritedVisibility`]: https://docs.rs/bevy/*/bevy/render/view/struct.InheritedVisibility.html
[`ViewVisibility`]: https://docs.rs/bevy/*/bevy/render/view/struct.ViewVisibility.html
[`Visibility`]: https://docs.rs/bevy/*/bevy/render/view/struct.Visibility.html
[`GlobalTransform`]: https://docs.rs/bevy/*/bevy/transform/components/struct.GlobalTransform.html
[`ChildOf`]: https://docs.rs/bevy/*/bevy/ecs/hierarchy/struct.ChildOf.html
[`Entity`]: https://docs.rs/bevy/*/bevy/ecs/entity/struct.Entity.html