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,
}
}
}