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 时需注意:无法查询整个组件包,只能查询“组件”,组件包有什么组件,就去查询里面包含的组件。