Latest commit febb142

实体和组件

相关的官方文档:[ecs_guide]


实体

实体是一个整数 ID,这个 ID 用来标识一组特定的组件数值。

Commands 来创建新的实体。

组件

组件是与实体关联的数据。创建新的组件:定义一个 Rust 结构体或枚举,然后派生 Component 特型。

#![allow(unused)]
fn main() {
#[derive(Component)]
struct Health {
    hp: f32,
    extra: f32,
}
}

类型必须是唯一的:每个 Rust 类型只能对应实体内的一个组件。

用 wrapper(newtype 模式)结构把简单的类型变成独特的组件:

#![allow(unused)]
fn main() {
#[derive(Component)]
struct PlayerXp(u32);

#[derive(Component)]
struct PlayerName(String);
}

用空结构体来标记特定的实体。空结构体被称为“标记组件”,对查询过滤器很有用。

#![allow(unused)]
fn main() {
// 把空结构体 MainMenuUI 添加到所有的“菜单界面”实体中,以后可以用 MainMenuUI 来查询所有“菜单界面”实体
#[derive(Component)]
struct MainMenuUI;

// 用来标记“玩家”
#[derive(Component)]
struct Player;

// 用来标记“敌人”
#[derive(Component)]
struct Enemy;
}

可以用 Query 在系统中访问组件。可以用 Commands 添加/移除实体中的组件。

组件包

包就像“模板”一样,能轻松创建内含通用组件的实体。

#![allow(unused)]
fn main() {
#[derive(Bundle)]
struct PlayerBundle {
    xp: PlayerXp,
    name: PlayerName,
    health: Health,
    _p: Player,

    // 可以嵌套或包含另一个 Bundle
    // 添加一个用于 Bevy Sprite 的组件:
    #[bundle]
    sprite: SpriteSheetBundle,
}
}

Bevy 还把任何由组件组成的元组视为 Bundle:

#![allow(unused)]
fn main() {
(ComponentA, ComponentB, ComponentC)
}

使用 Query 时需注意:无法查询整个组件包,只能查询“组件”,组件包有什么组件,就去查询里面包含的组件。