pub struct OnCollisionEnd {
pub collider: Entity,
pub body: Option<Entity>,
}
Expand description
A collision event that is triggered for observers when two colliders stop touching.
The event is only triggered if the target entity has the CollisionEventsEnabled
component.
Unlike CollisionEnded
, this event can not be read using an EventReader
.
Instead, you must use an observer. This makes it good for entity-specific
collision listeners.
§Example
use avian3d::prelude::*;
use bevy::prelude::*;
#[derive(Component)]
struct Player;
#[derive(Component)]
struct PressurePlate;
fn setup_pressure_plates(mut commands: Commands) {
commands.spawn((
PressurePlate,
Collider::cuboid(1.0, 0.1, 1.0),
Sensor,
// Enable collision events for this entity.
CollisionEventsEnabled,
))
.observe(|trigger: Trigger<OnCollisionEnd>, player_query: Query<&Player>| {
let pressure_plate = trigger.target();
let other_entity = trigger.collider;
if player_query.contains(other_entity) {
println!("Player {other_entity} stepped off of pressure plate {pressure_plate}");
}
});
}
§Scheduling
The OnCollisionEnd
event is triggered after the physics step in the CollisionEventSystems
system set. At this point, the solver has already run and contact impulses have been updated.
Note that if one of the colliders was removed or the bounding boxes of the colliders stopped
overlapping, the ContactPair
between the entities was also removed, and the contact data
will not be available through Collisions
.
Fields§
§collider: Entity
The entity of the collider that stopped colliding with the Trigger::target
.
body: Option<Entity>
The entity of the rigid body that stopped colliding with the Trigger::target
.
If the collider is not attached to a rigid body, this will be None
.
Trait Implementations§
Source§impl Clone for OnCollisionEnd
impl Clone for OnCollisionEnd
Source§fn clone(&self) -> OnCollisionEnd
fn clone(&self) -> OnCollisionEnd
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl Debug for OnCollisionEnd
impl Debug for OnCollisionEnd
Source§impl Event for OnCollisionEnd
impl Event for OnCollisionEnd
Source§const AUTO_PROPAGATE: bool = false
const AUTO_PROPAGATE: bool = false
Trigger::propagate
.Source§type Traversal = ()
type Traversal = ()
Source§fn register_component_id(world: &mut World) -> ComponentId
fn register_component_id(world: &mut World) -> ComponentId
ComponentId
for this event type. Read moreSource§fn component_id(world: &World) -> Option<ComponentId>
fn component_id(world: &World) -> Option<ComponentId>
ComponentId
for this event type,
if it has already been generated. Read moreSource§impl PartialEq for OnCollisionEnd
impl PartialEq for OnCollisionEnd
impl Copy for OnCollisionEnd
impl StructuralPartialEq for OnCollisionEnd
Auto Trait Implementations§
impl Freeze for OnCollisionEnd
impl RefUnwindSafe for OnCollisionEnd
impl Send for OnCollisionEnd
impl Sync for OnCollisionEnd
impl Unpin for OnCollisionEnd
impl UnwindSafe for OnCollisionEnd
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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> 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> 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.