pub struct PhysicsPlugins { /* private fields */ }Expand description
A plugin group containing Avian’s plugins.
§Plugins
By default, the following plugins will be added:
| Plugin | Description | 
|---|---|
| PhysicsSchedulePlugin | Sets up the physics engine by initializing the necessary schedules, sets and resources. | 
| ColliderBackendPlugin | Handles generic collider backend logic, like initializing colliders and AABBs and updating related components. | 
| ColliderHierarchyPlugin | Manages ColliderOfrelationships based on the entity hierarchy. | 
| ColliderTransformPlugin | Propagates and updates transforms for colliders. | 
| BroadPhasePlugin | Finds pairs of entities with overlapping AABBs to reduce the number of potential contacts for the narrow phase. | 
| NarrowPhasePlugin | Manages contacts and generates contact constraints. | 
| SolverPlugins | A plugin group for the physics solver’s plugins. See the plugin group’s documentation for more information. | 
| JointPlugin | A plugin for managing and initializing joints. Does not include the actual joint solver. | 
| MassPropertyPlugin | Manages mass properties of dynamic rigid bodies. | 
| ForcePlugin | Manages and applies external forces, torques, and acceleration for rigid bodies. See the module-level documentation. | 
| SpatialQueryPlugin | Handles spatial queries like raycasting and shapecasting. | 
| PhysicsInterpolationPlugin | Transforminterpolation and extrapolation for rigid bodies. | 
| PhysicsTransformPlugin | Manages physics transforms and synchronizes them with Transform. | 
Optional additional plugins include:
| Plugin | Description | 
|---|---|
| [ PhysicsPickingPlugin] | Enables a physics picking backend for bevy_picking(only withbevy_pickingfeature enabled). | 
| PhysicsDebugPlugin | Renders physics objects and events like AABBs and contacts for debugging purposes (only with debug-pluginfeature enabled). | 
| [ PhysicsDiagnosticsPlugin] | Writes physics diagnostics to the DiagnosticsStore(only withbevy_diagnosticfeature enabled). | 
| [ PhysicsDiagnosticsUiPlugin] | Displays physics diagnostics with a debug UI overlay (only with diagnostic_uifeature enabled). | 
Refer to the documentation of the plugins for more information about their responsibilities and implementations.
§World Scale
The PhysicsLengthUnit resource is a units-per-meter scaling factor
that adjusts the engine’s internal properties to the scale of the world.
It is recommended to configure the length unit to match the approximate length
of the average dynamic object in the world to get the best simulation results.
For example, a 2D game might use pixels as units and have an average object size
of around 100 pixels. By setting the length unit to 100.0, the physics engine
will interpret 100 pixels as 1 meter for internal thresholds, improving stability.
The length unit can be set by inserting the resource like normal,
but it can also be specified through the PhysicsPlugins plugin group.
use avian2d::prelude::*;
use bevy::prelude::*;
fn main() {
    App::new()
        .add_plugins((
            DefaultPlugins,
            // A 2D game with 100 pixels per meter
            PhysicsPlugins::default().with_length_unit(100.0),
        ))
        .run();
}§Custom Schedule
You can run the PhysicsSchedule in any schedule you want by specifying the schedule when adding the plugin group:
use avian3d::prelude::*;
use bevy::prelude::*;
fn main() {
    App::new()
        // Run physics at a variable timestep in `PostUpdate`.
        .add_plugins((DefaultPlugins, PhysicsPlugins::new(PostUpdate)))
        .run();
}§Custom Plugins
First, create a new plugin. If you want to run your systems in the engine’s schedules, get either the PhysicsSchedule
or the SubstepSchedule. Then you can add your systems to that schedule and control system ordering with system sets like
PhysicsStepSystems, SolverSystems, or SubstepSolverSystems.
Here we will create a custom broad phase plugin that will replace the default BroadPhasePlugin:
use avian3d::prelude::*;
use bevy::prelude::*;
pub struct CustomBroadPhasePlugin;
impl Plugin for CustomBroadPhasePlugin {
    fn build(&self, app: &mut App) {
        // Make sure the PhysicsSchedule is available
        let physics_schedule = app
            .get_schedule_mut(PhysicsSchedule)
            .expect("add PhysicsSchedule first");
        // Add the system into the broad phase system set
        physics_schedule.add_systems(collect_collision_pairs.in_set(PhysicsStepSystems::BroadPhase));
    }
}
fn collect_collision_pairs() {
    // Implementation goes here
}Next, when creating your app, simply disable the default BroadPhasePlugin and add your custom plugin:
use avian3d::prelude::*;
use bevy::prelude::*;
fn main() {
    let mut app = App::new();
    app.add_plugins(DefaultPlugins);
    // Add PhysicsPlugins and replace default broad phase with our custom broad phase
    app.add_plugins(
        PhysicsPlugins::default()
            .build()
            .disable::<BroadPhasePlugin>()
            .add(CustomBroadPhasePlugin),
    );
    app.run();
}You can find a full working example here.
Implementations§
Source§impl PhysicsPlugins
 
impl PhysicsPlugins
Sourcepub fn new(schedule: impl ScheduleLabel) -> Self
 
pub fn new(schedule: impl ScheduleLabel) -> Self
Creates a PhysicsPlugins plugin group using the given schedule for running the PhysicsSchedule.
The default schedule is FixedPostUpdate.
Sourcepub fn with_collision_hooks<H: CollisionHooks + 'static>(
    self,
) -> PhysicsPluginsWithHooks<H>where
    for<'w, 's> SystemParamItem<'w, 's, H>: CollisionHooks,
 
pub fn with_collision_hooks<H: CollisionHooks + 'static>(
    self,
) -> PhysicsPluginsWithHooks<H>where
    for<'w, 's> SystemParamItem<'w, 's, H>: CollisionHooks,
Adds the given CollisionHooks for user-defined contact filtering and modification.
Returns a PhysicsPluginsWithHooks plugin group, which wraps the original PhysicsPlugins,
and applies the provided hooks. Only one set of collision hooks can be defined per application.
Sourcepub fn with_length_unit(self, unit: Scalar) -> Self
 
pub fn with_length_unit(self, unit: Scalar) -> Self
Sets the value used for the PhysicsLengthUnit, a units-per-meter scaling factor
that adjusts the engine’s internal properties to the scale of the world.
For example, a 2D game might use pixels as units and have an average object size
of around 100 pixels. By setting the length unit to 100.0, the physics engine
will interpret 100 pixels as 1 meter for internal thresholds, improving stability.
Note that this is not used to scale forces or any other user-facing inputs or outputs.
Instead, the value is only used to scale some internal length-based tolerances, such as
SleepingThreshold::linear and NarrowPhaseConfig::default_speculative_margin,
as well as the scale used for debug rendering.
Choosing the appropriate length unit can help improve stability and robustness.
§Example
use avian2d::prelude::*;
use bevy::prelude::*;
fn main() {
    App::new()
        .add_plugins((
            DefaultPlugins,
            // A 2D game with 100 pixels per meter
            PhysicsPlugins::default().with_length_unit(100.0),
        ))
        .run();
}Trait Implementations§
Source§impl Default for PhysicsPlugins
 
impl Default for PhysicsPlugins
Source§impl PluginGroup for PhysicsPlugins
 
impl PluginGroup for PhysicsPlugins
Source§fn build(self) -> PluginGroupBuilder
 
fn build(self) -> PluginGroupBuilder
Plugins that are to be added.Source§fn name() -> String
 
fn name() -> String
PluginGroup which is primarily used for debugging.Auto Trait Implementations§
impl Freeze for PhysicsPlugins
impl !RefUnwindSafe for PhysicsPlugins
impl Send for PhysicsPlugins
impl Sync for PhysicsPlugins
impl Unpin for PhysicsPlugins
impl !UnwindSafe for PhysicsPlugins
Blanket Implementations§
Source§impl<T, U> AsBindGroupShaderType<U> for T
 
impl<T, U> AsBindGroupShaderType<U> for T
Source§fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
 
fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
T ShaderType for self. When used in AsBindGroup
derives, it is safe to assume that all images in self exist.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>, which can then be
downcast into Box<dyn 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>, which 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.Source§impl<T> DowncastSend for T
 
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
 
impl<T> DowncastSync for T
Source§impl<T> FromWorld for Twhere
    T: Default,
 
impl<T> FromWorld for Twhere
    T: Default,
Source§fn from_world(_world: &mut World) -> T
 
fn from_world(_world: &mut World) -> T
Creates Self using default().
Source§impl<T, W> HasTypeWitness<W> for Twhere
    W: MakeTypeWitness<Arg = T>,
    T: ?Sized,
 
impl<T, W> HasTypeWitness<W> for Twhere
    W: MakeTypeWitness<Arg = T>,
    T: ?Sized,
Source§impl<T> Identity for Twhere
    T: ?Sized,
 
impl<T> Identity for Twhere
    T: ?Sized,
Source§impl<T> Instrument for T
 
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
 
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
 
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
 
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
 
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
 
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoResult<T> for T
 
impl<T> IntoResult<T> for T
Source§fn into_result(self) -> Result<T, RunSystemError>
 
fn into_result(self) -> Result<T, RunSystemError>
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
    SS: SubsetOf<SP>,
 
impl<SS, SP> SupersetOf<SS> for SPwhere
    SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
 
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
 
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
 
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
 
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.