Rust legion ECS 0.4 系统如何检查实体指定组件是否存在
Legion ECS 适配开发中的组件查询实现问题
开发背景
正在跟随Rust教程进行ECS开发,原教程基于Specs ECS实现,计划改用Legion ECS完成对应开发,当前使用的Legion版本为最新的0.4.0,整体适配过程顺利,直到遇到了功能实现的问题。
核心实现需求
需要创建一个系统,完成以下逻辑:
- 遍历所有同时拥有
ComponentA和ComponentB的实体 - 处理这两个组件的关联逻辑
- 检查该实体是否额外拥有
ComponentC,如果存在则执行特殊处理
原Specs版本的参考实现
原教程中Specs版本的实现示例代码如下:
// Uses Specs pub struct SystemA {} impl<'a> System<'a> for SystemA { type SystemData = ( Entities<'a>, WriteStorage<'a, ComponentA>, ReadStorage<'a, ComponentB>, ReadStorage<'a, ComponentC>); fn run(&mut self, data : Self::SystemData) { let (entities, mut compA, compB, compC) = data; // Finding all entities with ComponentA and ComponentB for (ent, compA, compB) in (&entities, &mut compA, &compB).join() { // Do stuff with compA and compB // Check if Entity also has ComponentC let c : Option<&ComponentC> = compC.get(ent); if let Some(c) = c { // Do something special with entity if it also has ComponentC } } } }
当前Legion版本的适配代码
按照Legion语法编写的当前系统代码如下:
#[system(for_each)] pub fn systemA(entity: &Entity, compA: &mut ComponentA, compB: &mut ComponentB) { // Do stuff with compA and compB // 如何检查当前实体是否持有ComponentC }
现存疑问
无法将上述逻辑顺利适配到Legion中,不清楚如何获取当前遍历实体的其他关联组件,具体疑问包含:
- 上述系统中的
Entity仅包含实体ID,不清楚如何在不获取World的情况下访问该实体的组件列表 - 不清楚Legion系统中是否存在访问
World的合规方法 - 不清楚是否存在其他实现方式,能够完成与上述Specs版本等价的功能
内容的提问来源于stack exchange,提问作者dvidbruhm
相关产品推荐
相关产品推荐

