实体

实体是世界中的主要关键值,组件可以附加到实体上。

不同的 ECS 系统处理实体的方式各不相同。在 Dojo 中,实体被视为世界中的一个主键值,可以附加组件。为了说明这一概念,请看一个简单的例子:游戏中的角色有一个 Moves 和一个 Position组件。

在定义该实体的组件时,需要注意的是,我们并不直接引用该实体。相反,我们只是提供了实体将包含的两个结构。这种方法强调了 ECS 系统的灵活性和可组合性,允许轻松创建和修改具有各种组件组合的实体。

#[derive(Component, Copy, Drop, Serde, SerdeLen)]
struct Moves {
    #[key]
    player: ContractAddress,
    remaining: u8,
}

#[derive(Component, Copy, Drop, Serde, SerdeLen)]
struct Health {
    #[key]
    player: ContractAddress,
    x: u32,
    y: u32
}

现在,让我们为角色创建一个 Spawn。需要注意的是,我们没有在任何地方明确定义实体。相反,我们使用 ctx.origin 来引用当前实体。

在本例中,我们使用 ctx.origin 来引用当前实体。

#[system]
mod spawn {
    use array::ArrayTrait;
    use box::BoxTrait;
    use traits::Into;
    use dojo::world::Context;

    use dojo_examples::components::Position;
    use dojo_examples::components::Moves;

    fn execute(ctx: Context) {
        let position = get!(ctx.world, ctx.origin, (Position));
        set!(
            ctx.world,
            (
                Moves {
                    player: ctx.origin, remaining: 10
                    }, Position {
                    player: ctx.origin, x: position.x + 10, y: position.y + 10
                },
            )
        );
        return ();
    }
}

ECS 理论:关于 ECS 系统的文章很多,如需深入了解,请阅读 ECS-FAQ