关系

Bevy官方查找祖先节点的代码。


fn tick_trees(
    q_parents: Query<&ChildOf>,
) {
    q_parents.root_ancestor(bt_entity),
    ...
}

// 这段代码非常有意思,本质上是通过递归,最终通过Err分支找到root.
impl<'w, 's, D: QueryData, F: QueryFilter> Query<'w, 's, D, F> {
  pub fn root_ancestor<R: Relationship>(&'w self, entity: Entity) -> Entity
    where
        <D as QueryData>::ReadOnly: QueryData<Item<'w> = &'w R>,
    {
        // Recursively search up the tree until we're out of parents
        match self.get(entity) {
            Ok(parent) => self.root_ancestor(parent.get()),
            Err(_) => entity,
        }
    }
}