terminalCode Example
Collision and Triggers
Working with physics collisions and trigger volumes.
Collision Components
| Component | Purpose |
|---|---|
| BoxCollider | Box-shaped collision |
| SphereCollider | Spherical collision |
| CapsuleCollider | Capsule (common for characters) |
| MeshCollider | Convex 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
| Method | Called When |
|---|---|
| OnPhysicsCollision | Physics objects collide |
| OnTriggerEnter | Object enters trigger |
| OnTriggerExit | Object leaves trigger |
Was this helpful?