Description
- This issue exists as an evolution of the context surrounding Support With<Bundle> rather than just With<Component> #9215
What problem does this solve or what need does it fill?
With the merging of #14791, bevy itself is moving away from the usage of Bundle
structs as a means of adding many components to an entity at once, and recommends (but doesn't require that) ecosystem crates follow suit. Therefore, Bundle
s are more free to be used in other cases with less of a worry about introducing footguns, since they are being phased out from common usage (but not completely removed).
The most immediate helpful place Bundle
s would find usage in is filters:
// Why should we have to write all of this:
Query<Entity, (With<A>, With<B>, With<C>)>
// When we should be able to write this:
Query<Entity, With<(A, B, C)>>
// And if we need to `OR` them:
Query<Entity, Or<(With<A>, With<B>, With<C>)>>
// We should be able to do:
Query<Entity, With<(A, B, C), Any>>
What solution would you like?
These filters:
struct With<T: Component>;
struct Without<T: Component>;
struct Changed<T: Component>;
struct Added<T: Component>;
Become:
struct With<B: Bundle, Join = All>;
struct Without<B: Bundle, Join = All>;
struct Changed<B: Bundle, Join = All>;
struct Added<B: Bundle, Join = All>;
The additional Join
generic parameter specifies how the tuple conjunction is performed:
All
:With<(A, B, C), All>
meansWith<A> AND With<B> AND With<C>
Any
:With<(A, B, C), Any>
meansWith<A> OR With<B> OR With<C>
We should determine if the default conjunction for Without
should be Any
instead of All
.
Note: std::any::Any
already exists. We should try to find an alternative naming scheme that doesn't clash with std types or pre-existing bevy types, but we may have to resort to doing so anyways if no better alternative is found.
What alternative(s) have you considered?
Bundle tuples only
To reduce controversy, #9255 proposed implementing With<B: Bundle>
and other filters only for Bundle
s made of tuples. I believe this to no longer be necessary as Bundle
s are being phased out in favor of required components, so it's believed that developers will have less of a draw towards thinking in terms of Bundle
s (which would have been a poor-man's way of doing OOP).
Conjunction-first
Previously suggested is a flipping of the filter type and conjunction type:
Any<(A, B, C), With>
Any<(A, B, C), Without>
All<(A, B, C), With>
// ...
However that ran into issues with HKTs (higher kinded types), and is verbose in the single-component case.
Additional context
- Issue where it was originally removed: Anti-feature request: remove
WithBundle
#2620 - Related issue regarding bundles in queries: Component Bundle Queries #2252
- Previous issue: Support With<Bundle> rather than just With<Component> #9215
- PR originating from previous issue: Shortcut for
With
andWithout
#9255 - Recent discussion on discord