Latest commit d7a897d

命令

相关的官方文档:[ecs_guide]


Comands 的作用:

  • 生成或销毁实体
  • 给实体添加或移除组件
  • 管理资源

Command 不是立即生效,而是排队等待,在安全时执行。查看 [Stage]。(如果不用 Stage,系统会在[下一帧更新]时看到它们。)

#![allow(unused)]
fn main() {
fn spawn_player(mut commands: Commands) {
    // 管理资源
    commands.insert_resource(GoalsReached {
        main_goal: false,
        bonus: false,
    });
    commands.remove_resource::<MyResource>();

    // 用 spawn 生成新的实体
    let entity_id = commands
        .spawn()
        // 添加组件
        .insert(ComponentA)
        // 添加Bundle
        .insert_bundle(MyBundle::default())
        // 获取实体的 ID
        .id();

    // 用 Bundle 创建实体
    commands.spawn_bundle(PlayerBundle {
        name: PlayerName("Henry".into()),
        xp: PlayerXp(1000),
        health: Health {
            hp: 100.0,
            extra: 20.0,
        },
        _p: Player,
        sprite: Default::default(),
    });

    // 生成另一个实体
    // 注意:组件组合成元组就变成了 Bundle
    let other = commands
        .spawn_bundle((
            ComponentA::default(),
            ComponentB::default(),
            ComponentC::default(),
        ))
        .id();

    // 给实体添加或移除组件
    commands
        .entity(entity_id)
        .insert(ComponentB)
        .remove::<ComponentA>()
        .remove_bundle::<MyBundle>();

    // 销毁实体
    commands.entity(other).despawn();
}

fn make_all_players_hostile(mut commands: Commands, query: Query<Entity, With<Player>>) {
    for entity in query.iter() {
        // 给实体添加一个 Enemy 组件
        commands.entity(entity).insert(Enemy);
    }
}
}

注意不要混淆 Component 和 Bundle。例如: .insert_bundle 与 Bundle 组合使用,会正确地从 Bundle 中添加所有组件;.insert 和 Bundle 组合使用,只会把 Bundle 作为单个组件添加。