mirror of
https://github.com/bevyengine/bevy
synced 2024-11-22 20:53:53 +00:00
86ad5bf420
In response to #2023, here is a draft for a PR. Fixes #2023 I've added an example to show how to use `WithBundle`, and also to test it out. Right now there is a bug: If a bundle and a query are "the same", then it doesn't filter out what it needs to filter out. Example: ``` Print component initated from bundle. [examples/ecs/query_bundle.rs:57] x = Dummy( <========= This should not get printed 111, ) [examples/ecs/query_bundle.rs:57] x = Dummy( 222, ) Show all components [examples/ecs/query_bundle.rs:50] x = Dummy( 111, ) [examples/ecs/query_bundle.rs:50] x = Dummy( 222, ) ``` However, it behaves the right way, if I add one more component to the bundle, so the query and the bundle doesn't look the same: ``` Print component initated from bundle. [examples/ecs/query_bundle.rs:57] x = Dummy( 222, ) Show all components [examples/ecs/query_bundle.rs:50] x = Dummy( 111, ) [examples/ecs/query_bundle.rs:50] x = Dummy( 222, ) ``` I hope this helps. I'm definitely up for tinkering with this, and adding anything that I'm asked to add or change. Co-authored-by: Carter Anderson <mcanders1@gmail.com>
50 lines
1.3 KiB
Rust
50 lines
1.3 KiB
Rust
use bevy::{log::LogPlugin, prelude::*};
|
|
|
|
fn main() {
|
|
App::build()
|
|
.add_plugin(LogPlugin)
|
|
.add_startup_system(setup.system())
|
|
.add_system(log_names.system().label(LogNamesSystem))
|
|
.add_system(log_person_bundles.system().after(LogNamesSystem))
|
|
.run();
|
|
}
|
|
|
|
#[derive(Debug, Hash, PartialEq, Eq, Clone, SystemLabel)]
|
|
struct LogNamesSystem;
|
|
|
|
#[derive(Debug)]
|
|
struct Name(String);
|
|
|
|
#[derive(Debug)]
|
|
struct Age(usize);
|
|
|
|
#[derive(Debug, Bundle)]
|
|
struct PersonBundle {
|
|
name: Name,
|
|
age: Age,
|
|
}
|
|
|
|
/// Sets up two entities, one with a [Name] component as part of a bundle,
|
|
/// and one entity with [Name] only.
|
|
fn setup(mut commands: Commands) {
|
|
commands.spawn().insert(Name("Steve".to_string()));
|
|
commands.spawn().insert_bundle(PersonBundle {
|
|
name: Name("Bob".to_string()),
|
|
age: Age(40),
|
|
});
|
|
}
|
|
|
|
fn log_names(query: Query<&Name>) {
|
|
info!("Log all entities with `Name` component");
|
|
// this will necessarily have to print both components.
|
|
for name in query.iter() {
|
|
info!("{:?}", name);
|
|
}
|
|
}
|
|
fn log_person_bundles(query: Query<&Name, WithBundle<PersonBundle>>) {
|
|
info!("Log `Name` components from entities that have all components in `PersonBundle`.");
|
|
// this should only print `Name("Bob")`.
|
|
for name in query.iter() {
|
|
info!("{:?}", name);
|
|
}
|
|
}
|