pub struct Changed<T>(/* private fields */);
Expand description
A filter on a component that only retains results added or mutably dereferenced after the system last ran.
A common use for this filter is avoiding redundant work when values have not changed.
Note that simply mutably dereferencing a component is considered a change (DerefMut
).
Bevy does not compare components to their previous values.
To retain all results without filtering but still check whether they were changed after the
system last ran, use Ref<T>
.
Deferred
Note, that entity modifications issued with Commands
(like entity creation or entity component addition or removal)
are visible only after deferred operations are applied,
typically at the end of the schedule iteration.
Time complexity
Changed
is not ArchetypeFilter
, which practically means that
if query (with T
component filter) matches million entities,
Changed<T>
filter will iterate over all of them even if none of them were changed.
For example, these two systems are roughly equivalent in terms of performance:
fn system1(q: Query<&MyComponent, Changed<Transform>>) {
for item in &q { /* component changed */ }
}
fn system2(q: Query<(&MyComponent, Ref<Transform>)>) {
for item in &q {
if item.1.is_changed() { /* component changed */ }
}
}
Examples
fn print_moving_objects_system(query: Query<&Name, Changed<Transform>>) {
for name in &query {
println!("Entity Moved: {:?}", name);
}
}
Trait Implementations§
source§impl<T: Component> QueryFilter for Changed<T>
impl<T: Component> QueryFilter for Changed<T>
source§impl<T: Component> WorldQuery for Changed<T>
impl<T: Component> WorldQuery for Changed<T>
SAFETY:
fetch
accesses a single component in a readonly way.
This is sound because update_component_access
and update_archetype_component_access
add read access for that component and panic when appropriate.
update_component_access
adds a With
filter for a component.
This is sound because matches_component_set
returns whether the set contains that component.
§type Item<'w> = bool
type Item<'w> = bool
WorldQuery
For QueryData
this will be the item returned by the query.
For QueryFilter
this will be either ()
, or a bool
indicating whether the entity should be included
or a tuple of such things.§type Fetch<'w> = ChangedFetch<'w>
type Fetch<'w> = ChangedFetch<'w>
WorldQuery
to fetch Self::Item
§type State = ComponentId
type State = ComponentId
Self::Fetch
. This will be cached inside QueryState
,
so it is best to move as much data / computation here as possible to reduce the cost of
constructing Self::Fetch
.source§fn shrink<'wlong: 'wshort, 'wshort>(
item: Self::Item<'wlong>
) -> Self::Item<'wshort>
fn shrink<'wlong: 'wshort, 'wshort>( item: Self::Item<'wlong> ) -> Self::Item<'wshort>
source§unsafe fn init_fetch<'w>(
world: UnsafeWorldCell<'w>,
id: &ComponentId,
last_run: Tick,
this_run: Tick
) -> Self::Fetch<'w>
unsafe fn init_fetch<'w>( world: UnsafeWorldCell<'w>, id: &ComponentId, last_run: Tick, this_run: Tick ) -> Self::Fetch<'w>
source§const IS_DENSE: bool = _
const IS_DENSE: bool = _
WorldQuery::set_table
must be used before
WorldQuery::fetch
can be called for iterators. If this returns false,
WorldQuery::set_archetype
must be used before WorldQuery::fetch
can be called for
iterators.source§unsafe fn set_archetype<'w>(
fetch: &mut Self::Fetch<'w>,
component_id: &ComponentId,
_archetype: &'w Archetype,
table: &'w Table
)
unsafe fn set_archetype<'w>( fetch: &mut Self::Fetch<'w>, component_id: &ComponentId, _archetype: &'w Archetype, table: &'w Table )
Archetype
. This will always be called on
archetypes that match this WorldQuery
. Read moresource§unsafe fn set_table<'w>(
fetch: &mut Self::Fetch<'w>,
component_id: &ComponentId,
table: &'w Table
)
unsafe fn set_table<'w>( fetch: &mut Self::Fetch<'w>, component_id: &ComponentId, table: &'w Table )
Table
. This will always be called on tables
that match this WorldQuery
. Read moresource§unsafe fn fetch<'w>(
fetch: &mut Self::Fetch<'w>,
entity: Entity,
table_row: TableRow
) -> Self::Item<'w>
unsafe fn fetch<'w>( fetch: &mut Self::Fetch<'w>, entity: Entity, table_row: TableRow ) -> Self::Item<'w>
Self::Item
for either the given entity
in the current Table
,
or for the given entity
in the current Archetype
. This must always be called after
WorldQuery::set_table
with a table_row
in the range of the current Table
or after
WorldQuery::set_archetype
with a entity
in the current archetype. Read moresource§fn update_component_access(
id: &ComponentId,
access: &mut FilteredAccess<ComponentId>
)
fn update_component_access( id: &ComponentId, access: &mut FilteredAccess<ComponentId> )
WorldQuery
to access
.source§fn init_state(world: &mut World) -> ComponentId
fn init_state(world: &mut World) -> ComponentId
State
for this WorldQuery
type.source§fn get_state(world: &World) -> Option<ComponentId>
fn get_state(world: &World) -> Option<ComponentId>
State
for this WorldQuery
type.source§fn matches_component_set(
id: &ComponentId,
set_contains_id: &impl Fn(ComponentId) -> bool
) -> bool
fn matches_component_set( id: &ComponentId, set_contains_id: &impl Fn(ComponentId) -> bool ) -> bool
true
if this query matches a set of components. Otherwise, returns false
.source§fn set_access(_state: &mut Self::State, _access: &FilteredAccess<ComponentId>)
fn set_access(_state: &mut Self::State, _access: &FilteredAccess<ComponentId>)
FilteredEntityRef
or FilteredEntityMut
. Read moreAuto Trait Implementations§
impl<T> RefUnwindSafe for Changed<T>where
T: RefUnwindSafe,
impl<T> Send for Changed<T>where
T: Send,
impl<T> Sync for Changed<T>where
T: Sync,
impl<T> Unpin for Changed<T>where
T: Unpin,
impl<T> UnwindSafe for Changed<T>where
T: UnwindSafe,
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.