terminalCode Example

Collision and Triggers

calendar_today May 3, 2026 schedule ~1 min read person patrickjr verified 50

Working with physics collisions and trigger volumes.

Collision Components

ComponentPurpose
BoxColliderBox-shaped collision
SphereColliderSpherical collision
CapsuleColliderCapsule (common for characters)
MeshColliderConvex mesh collision

Basic Collision

CSHARP
public class CollisionObject : Component, IScenePhysicsEvents
{
    public void OnPhysicsCollision(Collision collision)
    {
        Log.Info($"Collided with {collision.Other.GameObject}");
        Log.Info($"Impact force: {collision.Impact}");
        
        // Access contact points
        foreach (var contact in collision.Contacts)
        {
            Log.Info($"Contact at {contact.Point}, normal: {contact.Normal}");
        }
    }
}

Trigger Volumes

Triggers detect overlap without blocking movement:

CSHARP
public class TriggerZone : Component, IScenePhysicsEvents
{
    void OnEnabled()
    {
        var collider = Components.Get<BoxCollider>();
        collider.IsTrigger = true; // Must be trigger
    }
    
    public void OnTriggerEnter(Collider other)
    {
        Log.Info($"{other.GameObject} entered trigger");
        
        if (other.GameObject.Tags.Has("player"))
        {
            // Player entered zone
        }
    }
    
    public void OnTriggerExit(Collider other)
    {
        Log.Info($"{other.GameObject} left trigger");
    }
}

Collision Filtering

Control what collides with what:

CSHARP
// In Project Settings → Physics
// Set up collision matrix layers

// In code
var collider = Components.Get<Collider>();
collider.CollisionGroup = CollisionGroup.Player;
collider.CollisionTags.Add("friendly");

Raycast for Interaction

CSHARP
void CheckInteraction()
{
    var eyePos = WorldPosition + Vector3.Up * 64f;
    var forward = WorldRotation.Forward;
    
    var tr = Scene.Trace.Ray(eyePos, eyePos + forward * 100f)
        .WithTag("interactable")
        .Run();
        
    if (tr.Hit && tr.GameObject.IsValid())
    {
        tr.GameObject.Components.Get<IInteractable>()?.Interact(this);
    }
}

Collision Events Summary

MethodCalled When
OnPhysicsCollisionPhysics objects collide
OnTriggerEnterObject enters trigger
OnTriggerExitObject leaves trigger
Was this helpful?