🕊️
RustのゲームエンジンBevyにあるComponentとEntity、Query それぞれの関係性について
それぞれの利用の流れ
- Componentを定義する
- Componentを使用してEntityを生成する
- 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