Create EntityCommands::remove_if
(#18899)
# Objective Fixes #18857. ## Solution Add the requested method, and a `try_` variant as well. ## Testing It compiles, doctests succeed, and is trivial enough that I don't think it needs a unit test (correct me if I'm wrong though).
This commit is contained in:
parent
2b7cecd5b3
commit
9167f02bdf
@ -1618,6 +1618,63 @@ impl<'a> EntityCommands<'a> {
|
|||||||
self.queue_handled(entity_command::remove::<B>(), warn)
|
self.queue_handled(entity_command::remove::<B>(), warn)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Removes a [`Bundle`] of components from the entity if the predicate returns true.
|
||||||
|
///
|
||||||
|
/// This is useful for chaining method calls.
|
||||||
|
///
|
||||||
|
/// # Example
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// # use bevy_ecs::prelude::*;
|
||||||
|
/// # #[derive(Resource)]
|
||||||
|
/// # struct PlayerEntity { entity: Entity }
|
||||||
|
/// # impl PlayerEntity { fn is_spectator(&self) -> bool { true } }
|
||||||
|
/// #[derive(Component)]
|
||||||
|
/// struct Health(u32);
|
||||||
|
/// #[derive(Component)]
|
||||||
|
/// struct Strength(u32);
|
||||||
|
/// #[derive(Component)]
|
||||||
|
/// struct Defense(u32);
|
||||||
|
///
|
||||||
|
/// #[derive(Bundle)]
|
||||||
|
/// struct CombatBundle {
|
||||||
|
/// health: Health,
|
||||||
|
/// strength: Strength,
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// fn remove_combat_stats_system(mut commands: Commands, player: Res<PlayerEntity>) {
|
||||||
|
/// commands
|
||||||
|
/// .entity(player.entity)
|
||||||
|
/// .remove_if::<(Defense, CombatBundle)>(|| !player.is_spectator());
|
||||||
|
/// }
|
||||||
|
/// # bevy_ecs::system::assert_is_system(remove_combat_stats_system);
|
||||||
|
/// ```
|
||||||
|
#[track_caller]
|
||||||
|
pub fn remove_if<B: Bundle>(&mut self, condition: impl FnOnce() -> bool) -> &mut Self {
|
||||||
|
if condition() {
|
||||||
|
self.remove::<B>()
|
||||||
|
} else {
|
||||||
|
self
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Removes a [`Bundle`] of components from the entity if the predicate returns true.
|
||||||
|
///
|
||||||
|
/// This is useful for chaining method calls.
|
||||||
|
///
|
||||||
|
/// # Note
|
||||||
|
///
|
||||||
|
/// If the entity does not exist when this command is executed,
|
||||||
|
/// the resulting error will be ignored.
|
||||||
|
#[track_caller]
|
||||||
|
pub fn try_remove_if<B: Bundle>(&mut self, condition: impl FnOnce() -> bool) -> &mut Self {
|
||||||
|
if condition() {
|
||||||
|
self.try_remove::<B>()
|
||||||
|
} else {
|
||||||
|
self
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Removes a [`Bundle`] of components from the entity.
|
/// Removes a [`Bundle`] of components from the entity.
|
||||||
///
|
///
|
||||||
/// This will remove all components that intersect with the provided bundle;
|
/// This will remove all components that intersect with the provided bundle;
|
||||||
|
Loading…
Reference in New Issue
Block a user