#component #entity-component #entities #bevy #named #scene #single

bevy_descendant_collector

Bevy包,用于将命名实体收集到一个组件中

3个不稳定版本

0.2.0 2024年7月6日
0.1.1 2024年5月4日
0.1.0 2024年3月11日

#394 in 游戏开发

29 每月下载次数

MIT 许可证

1MB
370 代码行

bevy_descendant_collector

ci

该包允许您将复杂的实体树映射到单个组件中,只要这些实体(及其祖先)被命名。

这对于从GLTF模型生成的场景尤其有用,因为您需要复杂的查询来从场景层次结构中检索深层次的实体。

示例

运行示例

cargo run -p bevy_descendant_collector --example turret

想象您有一个模型文件,在Blender中的结构如下

Collection
├── Armature
   ├── Bone.Root
   │   └── Bone.Neck
   │       └── Bone.Head
   └── Bone.Head.IK_CTRL

您可以定义一个组件如下

#[derive(Component, EntityCollectorTarget)]
#[name_path("Armature")]
pub struct MyTurretArmature {
	#[name_path("Bone.Root")]
	pub base: Entity,
	#[name_path("Bone.Root", "Bone.Neck")]
	pub neck: Entity,
	#[name_path("Bone.Root", "Bone.Neck", "Bone.Head")]
	pub head: Entity,
	#[name_path("Bone.Head.IK_CTRL")]
	pub head_ik_ctrl: Entity,
}

然后,您需要添加一个插件,此插件将处理此组件的插入

每个不同的EntityCollectorTarget需要添加自己的插件!

在这个示例中,这是一个GLTF模型,所以我希望根实体被解析为一个场景。 HierarchyRootPosition::Scene告诉插件根据#[name_path)]在实体后代中找到根,其中我想要插入此MyTurretArmature

app.add_plugins(DescendantCollectorPlugin::<MyTurretArmature>::new(HierarchyRootPosition::Scene));

最后,我需要确定我想要插入MyTurretArmature的实体!为此,当您生成此场景时,请将目标组件添加到您的实体中。

fn spawn_turret(mut commands: Commands, turret_model_assets: Res<TurretModelAssets>) {
	commands.spawn((
		SceneBundle {
			scene: turret_model_assets.turret_model.clone(),
			..default()
		},
		DescendantCollectorTarget::<MyTurretArmature>::default(),
	));
}

展开过程宏

如果您想检查过程宏的输出。

如果您还没有安装cargo-expand

cargo install cargo-expand
 cargo expand --example turret

Bevy兼容性表

Bevy bevy_descendant_collector
0.13 0.1

依赖项

~22MB
~416K SLoC