Chapter 4 18 min

Physics & Collision

Rigidbodies, colliders, and raycasting

Physics Components

Both engines use a similar physics model: a physics body for dynamics and collision shapes for detection. The names and setup differ:

Physics Components

Unreal EngineUnityNote
UStaticMeshComponent (Simulate Physics)RigidbodyEnables physics simulation
UBoxComponentBoxColliderBox-shaped collision
USphereComponentSphereColliderSphere-shaped collision
UCapsuleComponentCapsuleColliderCapsule-shaped collision
UPhysicsMaterialPhysicMaterialFriction, bounciness settings
Collision ChannelsLayers + Layer Collision MatrixWhat collides with what
In Unity, the Rigidbody and Collider are separate components. In Unreal, physics simulation is a property on mesh components. Unity's separation is more modular.

Collision Detection

Unreal uses Collision Channels and Object Types. Unity uses a Layer system with a Layer Collision Matrix (set in Project Settings → Physics).

Collision Layers

Unreal EngineUnityNote
WorldStaticDefaultStatic environment
WorldDynamicDefault (with Rigidbody)Moving objects
PawnPlayer (custom layer)Player characters
Projectile (custom)Projectile (custom layer)Bullets, arrows, etc.
Trigger (Overlap)Trigger (Is Trigger checkbox)Non-blocking detection zones

Collision Callbacks

Unreal uses Hit and Overlap events. Unity splits them into Collision (physical contact) and Trigger (non-physical overlap):

cpp
// Unreal: Overlap events
UFUNCTION()
void OnOverlapBegin(
    UPrimitiveComponent* OverlappedComp,
    AActor* OtherActor,
    UPrimitiveComponent* OtherComp,
    int32 OtherBodyIndex,
    bool bFromSweep,
    const FHitResult& SweepResult);

// Binding in constructor
CollisionComp->OnComponentBeginOverlap
    .AddDynamic(this, &AMyActor::OnOverlapBegin);

Raycasting

Both engines have raycasting for line-of-sight checks, ground detection, and shooting. The API is quite similar:

cpp
// Unreal: Line trace
FHitResult Hit;
FVector Start = GetActorLocation();
FVector End = Start + GetActorForwardVector() * 1000.f;

FCollisionQueryParams Params;
Params.AddIgnoredActor(this);

bool bHit = GetWorld()->LineTraceSingleByChannel(
    Hit, Start, End,
    ECC_Visibility, Params);

if (bHit)
{
    AActor* HitActor = Hit.GetActor();
    FVector HitPoint = Hit.ImpactPoint;
}

Physics Best Practices

Always do physics operations (forces, velocity changes, raycasts for gameplay) in FixedUpdate(), not Update(). This matches Unreal's substepping philosophy.
Deep Dive: 2D vs 3D Physics

Unity has separate 2D and 3D physics engines. If you're making a 2D game, use Rigidbody2D, BoxCollider2D, Physics2D.Raycast, etc. They don't interact with 3D physics.

3D vs 2D Physics

Unreal EngineUnity
Rigidbody (3D)Rigidbody / Rigidbody2D
BoxCollider (3D)BoxCollider / BoxCollider2D
Physics.RaycastPhysics.Raycast / Physics2D.Raycast
OnTriggerEnterOnTriggerEnter / OnTriggerEnter2D
Unreal doesn't have this split — its physics engine handles both 2D and 3D. In Unity, make sure you're using the right component set for your game type.