use std::any::TypeId; use bevy::prelude::*; use bevy_rapier3d::prelude::ExternalForce; use indexmap::IndexMap; #[derive(Component, Default)] pub struct ExternalForceSet { forces: IndexMap, } impl ExternalForceSet { pub fn get(&self) -> ExternalForce { self.forces .get(&TypeId::of::()) .copied() .unwrap_or_default() } pub fn set(&mut self, force: ExternalForce) { self.forces.insert(TypeId::of::(), force); } fn combine(&self) -> ExternalForce { self.forces .values() .fold(ExternalForce::default(), |f1, &f2| f1 + f2) } } pub fn update_external_forces(mut query: Query<(&mut ExternalForce, &ExternalForceSet)>) { for (mut force, forces) in &mut query { *force = forces.combine(); } }