You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编辑子实体的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 18:27:08