diff --git a/crates/bevy_ecs/src/system/query.rs b/crates/bevy_ecs/src/system/query.rs index fa997a0e40dec..6a384cbd077e9 100644 --- a/crates/bevy_ecs/src/system/query.rs +++ b/crates/bevy_ecs/src/system/query.rs @@ -2,8 +2,8 @@ use crate::{ component::Component, entity::Entity, query::{ - Fetch, FilterFetch, QueryCombinationIter, QueryEntityError, QueryIter, QueryState, - WorldQuery, + Fetch, FilterFetch, NopFetch, QueryCombinationIter, QueryEntityError, QueryIter, + QueryState, WorldQuery, }, world::{Mut, World}, }; @@ -961,6 +961,42 @@ where self.state .is_empty(self.world, self.last_change_tick, self.change_tick) } + + /// Returns `true` if the given [`Entity`] matches the query. + /// + /// # Example + /// + /// ``` + /// # use bevy_ecs::prelude::*; + /// # + /// # #[derive(Component)] + /// # struct InRange; + /// # + /// # struct Target { + /// # entity: Entity, + /// # } + /// # + /// fn targeting_system(in_range_query: Query<&InRange>, target: Res) { + /// if in_range_query.contains(target.entity) { + /// println!("Bam!") + /// } + /// } + /// # targeting_system.system(); + /// ``` + #[inline] + pub fn contains(&self, entity: Entity) -> bool { + // SAFE: NopFetch does not access any members while &self ensures no one has exclusive access + unsafe { + self.state + .get_unchecked_manual::>( + self.world, + entity, + self.last_change_tick, + self.change_tick, + ) + .is_ok() + } + } } /// An error that occurs when retrieving a specific [`Entity`]'s component from a [`Query`]