CollisionListener

Custom collision handling.

Custom collision handling can be implemented by using the on_collision function on a node. Under the hood, this function adds a LambdaCollisionListener component to that node. This component inherits from the CollisionListener component, which is the base component for all collision listeners. You can create your own component, inherit from CollisionListener, add it to a node, and this component will receive collision callbacks from that node.

Note

To receive collision callbacks, the body should have an active RigidBody or CharacterController component.

Note

MotionType Static is the cheapest motionType for a body to receive callbacks, but it has its limitations. See MotionType.

This component is provided by the engine.physics_core module, which is included in the engine.core module.

Example:

require engine.core

let node = create_node(NodeData())
add_component(node, new RigidBody())
on_collision(node) @(collision) {
    print("Collision detected")
}

See also Physics Simulation in a Main Loop

Structures

Collision

Collision event

Fields:
  • nodeId : NodeId - the other body that collides with the receiver body

  • normal : float3 - normal of the collision on the other node (world space)

  • penetration : float - penetration depth

  • impulse : float - collision impulse, use for impact measurement

  • positions : array<float3> - positions of the collision (world space, not empty)

Classes

CollisionListener : Component

Base component for all collision callback handlers. When added to a node with an active RigidBody component, it starts receiving collision callbacks for it.

You can create a custom component, inherit it from CollisionListener, override methods, and receive callbacks to yourself

However, if you want a quick collision handling, consider using on_collision function.

Usage example:

class CustomCollisionListener : CollisionListener {
    def override on_initialize() {
        super.on_initialize()
        // ...
    }

    def override on_collision(c: Collision) {
        // Collision started
        ...
    }

    def override on_collision_stay(c: Collision) {
        // Collision stays
        ...
    }

    def override on_collision_exit(otherNode: NodeId) {
        // Collision finished
        ...
    }
}

// ...
add_component(node, new CustomCollisionListener())

Note

CharacterController generates collision events only with rigid bodies. To collide with other CharacterController-s, it must have an active RigidBody component.

CollisionListener.on_collision(collision: Collision)

Called when the body collides with another another node with a RigidBody component collides with this node.

The callback is called for every new collision.

Arguments:
CollisionListener.on_collision_stay(collision: Collision)

Registers a callback that is called when another node with a RigidBody component collides with this node.

The callback is called for every collisions that stays between frames.

Arguments:
CollisionListener.on_collision_exit(otherNode: NodeId)

Registers a callback that is called when another node with a RigidBody component collides with this node.

The callback is called for every finished collisions.

Arguments:
LambdaCollisionListener : CollisionListener

Collision handler that calls lambdas as custom handlers.

Don’t use this component directly, instead use on_collision function and others.

Usage example:

on_collision(node) @(collision) {
    print("Collision started between {node} and {collision.node}")
}
on_collision_stay(node) @(collision) {
    print("Collision stays between {node} and {collision.node}")
}
on_collision_exit(node) @(otherNode) {
    print("Collision finished between {node} and {otherNode}")
}
LambdaCollisionListener.on_collision(collision: Collision)

Called when you use on_collision on a node. See on_collision

Arguments:
LambdaCollisionListener.on_collision_stay(collision: Collision)

Called when you use on_collision_stay on a node. See on_collision_stay

Arguments:
LambdaCollisionListener.on_collision_exit(node: NodeId)

Called when you use on_collision_exit on a node. See on_collision_exit

Arguments:
LambdaCollisionListener.addOnCollisionListener(callback: lambda<(collision:Collision):void>)

Adds a callback for on_collision event.

Arguments:
  • callback : lambda<(collision: Collision ):void>

LambdaCollisionListener.addOnCollisionStayListener(callback: lambda<(collision:Collision):void>)

Adds a callback for on_collision_stay event.

Arguments:
  • callback : lambda<(collision: Collision ):void>

LambdaCollisionListener.addOnCollisionExitListener(callback: lambda<(otherNode:NodeId):void>)

Adds a callback for on_collision_exit event.

Arguments:
  • callback : lambda<(otherNode: NodeId ):void>