实体
实体是世界中的主要关键值,组件可以附加到实体上。
不同的 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