pub struct CollisionEnd {
pub collider1: Entity,
pub collider2: Entity,
pub body1: Option<Entity>,
pub body2: Option<Entity>,
}
Expand description
A collision event that is triggered when two colliders stop touching.
The event can be read using a MessageReader
or observed using an observer.
It is only triggered for entities with the CollisionEventsEnabled
component.
§Example
Below is an example of observing the CollisionEnd
event using an observer.
use avian2d::prelude::*;
use bevy::prelude::*;
#[derive(Component)]
struct Player;
#[derive(Component)]
struct PressurePlate;
fn setup_pressure_plates(mut commands: Commands) {
commands.spawn((
PressurePlate,
Collider::rectangle(1.0, 1.0),
Sensor,
// Enable collision events for this entity.
CollisionEventsEnabled,
))
.observe(on_player_stepped_off_plate);
}
fn on_player_stepped_off_plate(event: On<CollisionEnd>, player_query: Query<&Player>) {
// `colider1` and `body1` refer to the event target and its body.
// `collider2` and `body2` refer to the other collider and its body.
let pressure_plate = event.collider1;
let other_entity = event.collider2;
if player_query.contains(other_entity) {
println!("Player {other_entity} stepped off pressure plate {pressure_plate}");
}
}
The event can also be read as a Message
using a MessageReader
.
This can be more efficient for processing large numbers of collisions.
fn print_ended_collisions(mut collision_reader: MessageReader<CollisionEnd>) {
for event in collision_reader.read() {
println!("{} and {} stopped colliding", event.collider1, event.collider2);
}
}
§Scheduling
The CollisionEnd
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§
§collider1: Entity
The entity of the collider that stopped colliding with collider2
.
For observers watching this event as an EntityEvent
, this is the target entity.
collider2: Entity
The entity of the collider that stopped colliding with collider1
.
body1: Option<Entity>
The rigid body that collider1
is attached to.
If the collider is not attached to a rigid body, this will be None
.
body2: Option<Entity>
The rigid body that collider2
is attached to.
If the collider is not attached to a rigid body, this will be None
.
Trait Implementations§
Source§impl Clone for CollisionEnd
impl Clone for CollisionEnd
Source§fn clone(&self) -> CollisionEnd
fn clone(&self) -> CollisionEnd
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl Debug for CollisionEnd
impl Debug for CollisionEnd
Source§impl EntityEvent for CollisionEnd
impl EntityEvent for CollisionEnd
Source§fn event_target(&self) -> Entity
fn event_target(&self) -> Entity
Entity
“target” of this EntityEvent
. When triggered, this will run observers that watch for this specific entity.Source§fn event_target_mut(&mut self) -> &mut Entity
fn event_target_mut(&mut self) -> &mut Entity
Entity
“target” of this EntityEvent
. When triggered, this will run observers that watch for this specific entity. Read moreSource§impl Event for CollisionEnd
impl Event for CollisionEnd
Source§type Trigger<'a> = EntityTrigger
type Trigger<'a> = EntityTrigger
Trigger
for more info.Source§impl PartialEq for CollisionEnd
impl PartialEq for CollisionEnd
impl Copy for CollisionEnd
impl Message for CollisionEnd
impl StructuralPartialEq for CollisionEnd
Auto Trait Implementations§
impl Freeze for CollisionEnd
impl RefUnwindSafe for CollisionEnd
impl Send for CollisionEnd
impl Sync for CollisionEnd
impl Unpin for CollisionEnd
impl UnwindSafe for CollisionEnd
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>
, 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, 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.