add release note

This commit is contained in:
Emerson Coskey 2025-06-26 14:40:40 -07:00
parent 548ec53da3
commit 0011d170bd
No known key found for this signature in database

View File

@ -0,0 +1,45 @@
---
title: New QueryData Types
authors: ["@ecoskey"]
pull_requests: [19602]
---
Bevy queries have some new powers for advanced users. Namely, custom `WorldQuery`
implementations can store and apply "deferred" mutations, just like `Commands`!
This release includes a few new types making use of this capability, and
we're sure third-party crates will find all kinds of new ways to do cool stuff
with this.
## `DeferredMut`
When working with immutable components in Bevy, the acts of reading and writing
component values are very clearly separated. This can be valuable, especially
if a component has expensive hooks or observers attached and `insert`ing it
has a significant cost, but in some cases it can feel like boilerplate.
`DeferredMut` is meant to improve the ergonomics of the latter case, by providing
"fake" mutable access to any component, even immutable ones! Internally, it
keeps track of any modifications and inserts them into the ECS at the next
sync point.
```rs
// without `DeferredMut`
pub fn tick_poison(
mut commands: Commands,
query: Query<(Entity, &Health), With<Poisoned>>
) {
for (entity, Health(health_points)) in query {
commands.insert(entity, Health(health_points - 1))
}
}
// with `DeferredMut`
pub fn tick_poison(
mut health_query: Query<DeferredMut<Health>, With<Poisoned>>
) {
for mut health in &health_query {
health.0 -= 1;
}
}
```