如何编辑子实体的Transform组件?(Bevy引擎Rust开发场景)
解决方案
你不需要单独定义Query<&Children>,直接新增一个针对子实体的Query<&mut Transform>(可以加上With<TextBundle>过滤,确保只处理TextBundle子实体),然后在遍历子实体时直接从这个查询里获取可变Transform组件即可。
步骤1:调整查询定义
把你的查询改成这样:
// 父实体查询:包含Entity、Creature组件和可变Transform mut parent_query: Query<(Entity, &Creature, &mut Transform)>, // 子实体查询:针对带有TextBundle的实体的可变Transform mut child_transform_query: Query<&mut Transform, With<TextBundle>>, // 用于获取父实体的子实体列表 children_query: Query<&Children>,
步骤2:修改遍历逻辑
在循环里,先通过children_query获取父实体的子实体列表,再逐个从child_transform_query中取出可变Transform进行修改:
for (entity, _creature, mut parent_transform) in parent_query.iter_mut() { // 这里修改父实体的Transform parent_transform.translation.x += 10.0; // 获取当前父实体的所有子实体 if let Some(children) = children_query.get(entity).ok() { for child_entity in children.iter() { // 尝试获取子实体的可变Transform if let Ok(mut child_transform) = child_transform_query.get_mut(*child_entity) { // 这里修改子实体的Transform child_transform.scale = Vec3::splat(1.5); } } } }
简化写法(用iter_descendants)
如果你想用iter_descendants,可以直接基于children_query来遍历,然后同样用child_transform_query获取组件:
for (entity, _creature, mut parent_transform) in parent_query.iter_mut() { // 修改父实体Transform parent_transform.rotation = Quat::from_rotation_y(0.5); // 遍历所有子实体(包括深层子实体) for child_entity in children_query.iter_descendants(entity) { if let Ok(mut child_transform) = child_transform_query.get_mut(child_entity) { // 修改子实体Transform child_transform.translation.y += 5.0; } } }
关键说明
- 用
With<TextBundle>可以确保我们只修改属于TextBundle的子实体的Transform,避免误改其他类型的子实体。 - 使用
get_mut而不是直接iter_mut是因为子实体可能不存在Transform组件,或者当前查询没有访问权限,用ok()可以安全处理这种情况。
内容的提问来源于stack exchange,提问作者Bjørn Pollen
相关产品推荐
相关产品推荐

