微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有办法从 Rust Legion ECS 系统中看到并从中获取实体世界?

如何解决有没有办法从 Rust Legion ECS 系统中看到并从中获取实体世界?

我正在学习使用 Specs ECS 的 Rust 教程,我正在尝试使用 legion ECS 来实现它。我喜欢 Legion,一切都很顺利,直到我遇到问题。

我不知道如何表述我的问题。我想要做的是创建一个系统,该系统迭代每个实体,例如ComponentA 和 ComponentB,但也会检查实体是否具有 ComponentC,如果是,则执行一些特殊操作。

我可以使用规范(示例代码)来做到这一点:

// Uses Specs
pub struct SystemA {}

impl<'a> System<'a> for SystemA {
    type SystemData = ( Entities<'a>,WriteStorage<'a,ComponentA>,ReadStorage<'a,ComponentB>,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(目前使用最新的 0.4.0 版本)。我不知道如何获取当前实体拥有的其他组件。这是我的代码

#[system(for_each)]
pub fn systemA(entity: &Entity,compA: &mut compA,compB: &mut ComponentB) {
    // Do stuff with compA and compB

    // How do I check if entity has compC here?

}

上述系统中的实体仅包含其 ID。如何在没有 World 的情况下访问该实体具有的组件列表?或者有没有办法在军团系统中访问世界?或者有什么其他方法可以达到与 Specs 版本相同的效果

谢谢!

解决方法

您可以将 Option<...> 用于可选组件。

#[system(for_each)]
pub fn systemA(entity: &Entity,compA: &mut compA,compB: &mut ComponentB,compC: Option<&ComponentC>) {
    ...
    if let Some(compC) = compC {
        // this entity has compC
        ...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。