🕊️

RustのゲームエンジンBevyにあるComponentとEntity、Query それぞれの関係性について

2023/04/09に公開

それぞれの利用の流れ

  1. Componentを定義する
  2. Componentを使用してEntityを生成する
  3. Queryを用いて生成したEntityにアクセスする

Component

定義例

#[derive(Component)]
pub struct Person {
    pub name: String
}

#[derive(Component)]
pub struct Employed{
    pub job :Job,
}

タプルでまとめるとBundleになる

Entity

Entityの生成例

pub fn setup(mut commands: Commands){
    commands.spawn((
        Person { name: "Alex".to_string()},
        Employed { job: Job::Doctor },
    ));
    
    commands.spawn(Person { name: "Bob".to_string(),});
    
    commands.spawn((
        Person { name: "Charlie".to_string()},
        Employed { job: Job::FireFighter },
    ));
}

commands.spawn

Entityを生成するのに用いる。引数にComponentまたはBundleを入れる

Query

利用例

// Component「Person」を持つEntityを取得し名前を表示する
pub fn print_names(person_query: Query<&Person>){
    for person in person_query.iter() {
        println!("Name: {}", person.name);
    }
}

// Component「Person」を持ち かつ Component「Employed」を持つEntityを取得し名前を表示する
pub fn people_with_jobs(person_query: Query<&Person, With<Employed>>){
    for person in person_query.iter(){
        println!("{} has a job.", person.name);
    }
}

// Component「Person」を持ち かつ Component「Employed」を持たないEntityを取得し名前を表示する
pub fn people_ready_for_hire(person_query: Query<&Person, Without<Employed>>){
    for person in person_query.iter(){
        println!("{} is ready for hire", person.name);
    }
}

QueryのWithおよびWithoutのについて追加情報

下記の通り空のComponentを作成することができ、これはQueryのWithおよびWithoutで呼び出すときに役に立つ

#[derive(Component)]
struct Enemy;

#[derive(Component)]
struct Player;

参考サイト

Discussion