Struct avian3d::PhysicsPlugins
source · pub struct PhysicsPlugins { /* private fields */ }
Expand description
A plugin group containing all of Avian’s 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. |
PhysicsTypeRegistrationPlugin | Registers physics types to the TypeRegistry resource in bevy_reflect . |
PreparePlugin | Runs systems at the start of each physics frame. Initializes rigid bodies and updates components. |
ColliderBackendPlugin | Handles generic collider backend logic, like initializing colliders and AABBs and updating related components. |
ColliderHierarchyPlugin | Handles transform propagation and ColliderParent updates for colliders. |
BroadPhasePlugin | Collects pairs of potentially colliding entities into BroadCollisionPairs using AABB intersection checks. |
NarrowPhasePlugin | Computes contacts between entities and sends collision events. |
ContactReportingPlugin | Sends collision events and updates CollidingEntities . |
IntegratorPlugin | Handles motion caused by velocity, and applies external forces and gravity. |
SolverPlugin | Manages and solves contacts, joints, and other constraints. |
CcdPlugin | Performs sweep-based Continuous Collision Detection for bodies with the SweptCcd component. |
SleepingPlugin | Manages sleeping and waking for bodies, automatically deactivating them to save computational resources. |
SpatialQueryPlugin | Handles spatial queries like raycasting and shapecasting. |
SyncPlugin | Keeps Position and Rotation in sync with Transform . |
PhysicsDebugPlugin | Renders physics objects and events like AABBs and contacts for debugging purposes (only with debug-plugin feature 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()
.add_plugins((DefaultPlugins, PhysicsPlugins::new(FixedUpdate)))
.run();
}
Note that using FixedUpdate
with a fixed physics timestep can produce unexpected results due to two separate
fixed timesteps. However, using FixedUpdate
can be useful for networking usage
when you need to keep the client and server in sync.
§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
PhysicsStepSet
, SolverSet
, or SubstepSolverSet
.
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(PhysicsStepSet::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 PostUpdate
.
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
Plugin
s 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>
. Box<dyn Any>
can
then be further downcast
into Box<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>
. Rc<Any>
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> 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
Self
using data from the given World
.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> Pointable for T
impl<T> Pointable for T
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.