结构化动态查询构建器
□ 这能解决什么问题,或需要什么?
在Bevy中查询动态组件在今天是可能的,但通常是尴尬的.
动态组件的一个用例是 scripting . 如果我们有Lua脚本翻译,我们不妨将`LuaValue's作为元件储存在实体上。 这套组件将由脚本决定,因此我们无法在编译时知道完整的列表,但我们do知道它们各自被Rust作为共享的"LuaValue"类型所暴露.
另一种用途是 " 检查员 " 。 我们也许想要能够使用一个UI定义一个查询,然后浏览所产生的组件. 在这种情况下,我们想要询问现有的组件,但我们不会知道哪些类型,并且想用反射来曝光它们,作为"QQdyn反射".
□今日如何办?
目前的解决办法是实体参考书'和实体参考书'。 这些类型是执行“weeryData”但可用于查询动态定义的一组组件。 在实践中,他们可能尴尬地使用:
- 需要单独跟踪“组件”
对于静态查询,我们可以提供"weery"-"T",用户可以立即获得"QQ". 但是,“Filtered Entity RefQ”并不足以获得“LuaValue”或“QQdyn反射”。 我们需要通过确定该组成部分的额外数据,例如组件 ' 或反相组件 ' 价值。 这意味着“ 查询” < Filtered Entity Ref\ 不足以封装一个完整的查询。
无法表达无档案过滤器
对于静态查询,我们可以写出"weeryQQT",被更改为"TQ",查询本身将过滤出"T"没有改变的实体. 无法根据“ 组件” 过滤此软件的动态版本 被改变。 可以使用“ get change ticks by id()” 手动检查, 但这是“ 查询” < Filtered Entertitual Ref\\ 不足以封装完整查询的另一个案例 。
QQ 很难获得多个可变组件
对于静态查询,我们可以写出"Query <( & mut T, & mut U) > 以获得多笔借款,由Bevy处理所有检查别名。 但是Filtered EntityMut::get mut by id()'将借用整个Filtered EntityMut',因此我们需要使用`get mut unched()'等复杂或不安全的工作来获得多种可变组件。
效率低
对于静态查询,Bevy会缓存“ WorldQuery: Fetch” 类型中当前表格的指针,这样从每个实体获取一个组件就是一个简单的指针添加. `实体' Ref', 我们没有地方可以存储缓存, 类似“ Filtered Entity Ref: get by id” 的方法需要查看表格中每个实体的列索引。
□你想要什么解决方案?
我希望能够用“ Query<Vec<&mut dyn Reflection> 等类型来表达动态查询, 以查询未知数量的动态组件, 或“ LuaValue , & mut LuaValue, & mut Transform”) 来查询一组已知的带有运行时间“ ConcontonentIds” 的脚本组件。
解决了 . . . . . . .
内容来源: bevyengine/bevy