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(…)生成的实体没有ViewVisibilityInheritedVisibility组件。由于立方体作为没有可见性组件的实体的子级生成,因此它将完全不可见。

要解决此问题,您必须使用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的子级时遇到此警告。