B0004
运行时警告。
一个具有继承层次结构组件的 Entity
拥有一个 Parent
,但该 Parent
不具有该继承层次结构组件。
Bevy 中定义的继承层次结构组件包括:
第三方插件也可以定义自己的层次结构组件,因此请仔细阅读警告消息,并注意缺少组件的确切类型。
要解决此警告,请将缺少的层次结构组件添加到具有您要使用的层次结构组件的实体的所有祖先。
以下代码将导致发出警告
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(TransformBundle::default())
.with_children(|parent| {
// cube
parent.spawn(PbrBundle {
mesh: meshes.add(Cuboid::default()),
material: materials.add(Color::rgb(0.8, 0.7, 0.6)),
transform: Transform::from_xyz(0.0, 0.5, 0.0),
..default()
});
});
// camera
commands.spawn(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_systems(Startup, setup_cube)
.run();
}
此代码**不会**在屏幕上显示立方体。这是因为使用commands.spawn(…)
生成的实体没有ViewVisibility
或InheritedVisibility
组件。由于立方体作为没有可见性组件的实体的子级生成,因此它将完全不可见。
要解决此问题,您必须使用SpatialBundle
而不是TransformBundle
,如下所示
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
// visibility components needed to display the cube,
// In addition to the Transform and GlobalTransform components.
.spawn(SpatialBundle::default())
.with_children(|parent| {
// cube
parent.spawn(PbrBundle {
mesh: meshes.add(Cuboid::default()),
material: materials.add(Color::rgb(0.8, 0.7, 0.6)),
transform: Transform::from_xyz(0.0, 0.5, 0.0),
..default()
});
});
// camera
commands.spawn(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_systems(Startup, setup_cube)
.run();
}
当GlobalTransform
组件丢失时,也会出现类似的问题。但是,当父GlobalTransform
丢失时,它只会阻止所有变换传播,包括更新子级Transform
组件时的传播。
您很可能在将场景加载为没有适当组件的现有Entity
的子级时遇到此警告。