3个不稳定版本
0.2.0 | 2024年7月6日 |
---|---|
0.1.1 | 2024年5月4日 |
0.1.0 | 2024年3月11日 |
#394 in 游戏开发
29 每月下载次数
1MB
370 代码行
bevy_descendant_collector
该包允许您将复杂的实体树映射到单个组件中,只要这些实体(及其祖先)被命名。
这对于从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