rust - 有没有办法从 Rust legion ECS 系统中查看(并从中获取实体)世界?

标签 rust entity-component-system

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

我不确定如何表述我的问题。我想做的是创建一个系统来迭代每个实体,例如ComponentA 和 ComponentB,但这也会检查实体是否有 ComponentC,如果是的话,会做一些特殊的事情。

我可以使用 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(目前使用最新的 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。我如何在没有世界的情况下访问该实体的组件列表?或者有没有办法在军团系统中访问世界?或者任何其他方式来实现与 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
        ...

关于rust - 有没有办法从 Rust legion ECS 系统中查看(并从中获取实体)世界?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66557561/

相关文章:

dictionary - 需要 Rust 映射语法说明

rust - 尝试使用Rust tokio Framed LinesCodec写入服务器

rust - 如何查看 TcpStream 并阻塞直到有足够的字节可用?

c++ - 存储所有类实例的 vector ,并调用它们的成员函数

java - libgdx ashley - 如何以正确的方式控制播放器(ECS 框架)?

javascript - Typescript 忽略部分数据的 getters setters 只读?

rust - 派生特征会导致意外的编译器错误,但手动实现有效

rust - Rust 中函数的类型同义词

c++ - 在实体组件系统中将实体与系统匹配的有效方法

c# - 从集合持有接口(interface)返回类而不是接口(interface)