Quick answer: The most common cause is that Generate Overlap Events is not enabled on both components involved in the overlap. Both the overlapping component and the component being overlapped must have this flag set to true.

Here is how to fix Unreal overlap event not triggering. You set up a trigger volume with a box or sphere collision component, bound the OnComponentBeginOverlap delegate, and walked your character right through it — nothing happens. The delegate never fires. This is one of the most common collision issues in Unreal Engine, and it is almost always caused by a configuration mismatch between the two components involved in the overlap.

The Symptom

You have an actor with a UBoxComponent or USphereComponent intended to act as a trigger zone. You bound a function to OnComponentBeginOverlap, either in C++ with AddDynamic or in Blueprint with the event node. When your player character or another actor enters the collision volume at runtime, the bound function is never called. No overlap event fires.

You can see both actors overlapping visually in the scene. If you enable collision debug drawing with show Collision in the console, the collision shapes are clearly intersecting. But the event simply does not fire. There are no errors in the Output Log to point you in the right direction.

What Causes This

1. Generate Overlap Events is disabled. This is the most frequently missed setting. Unreal requires bGenerateOverlapEvents to be true on both components involved in the overlap — not just the trigger volume, but also the component on the moving actor. Many developers enable it on their trigger box but forget to check the capsule component on their character. If either side has it disabled, no overlap event is generated.

2. Collision responses are wrong. For an overlap event to fire, the collision response between the two components' object channels must be set to Overlap. If both are set to Block, you get a hit event and physical blocking instead. If either is set to Ignore, no interaction happens at all. The collision preset dropdowns in the Details panel control this, and the default presets do not always have Overlap enabled for every channel.

3. One component has no collision enabled. If a component's collision is set to NoCollision via the Collision Enabled dropdown, it is invisible to the physics system entirely. This can happen when you set up a mesh component and forget to configure its collision, or when a collision preset unexpectedly disables collision on a component you assumed was active.

4. Both components are set to Block each other. When two components block each other, the physics engine generates OnHit events, not overlap events. The character physically cannot enter the trigger volume because it is being blocked. The overlap delegate is never called because no overlap actually occurs — the penetration is resolved before it happens.

The Fix

Step 1: Enable Generate Overlap Events on both components and configure collision properly in the constructor.

// TriggerZone.h
UCLASS()
class ATriggerZone : public AActor
{
    GENERATED_BODY()
public:
    ATriggerZone();

    UPROPERTY(VisibleAnywhere)
    UBoxComponent* TriggerBox;

    UFUNCTION()
    void OnOverlapBegin(UPrimitiveComponent* OverlappedComp, AActor* OtherActor,
        UPrimitiveComponent* OtherComp, int32 OtherBodyIndex,
        bool bFromSweep, const FHitResult& SweepResult);
};
// TriggerZone.cpp
ATriggerZone::ATriggerZone()
{
    TriggerBox = CreateDefaultSubobject<UBoxComponent>(TEXT("TriggerBox"));
    RootComponent = TriggerBox;

    // Critical: enable overlap event generation
    TriggerBox->SetGenerateOverlapEvents(true);

    // Set collision to query-only (no physics, just overlaps)
    TriggerBox->SetCollisionEnabled(ECollisionEnabled::QueryOnly);

    // Set the object type and response
    TriggerBox->SetCollisionObjectType(ECC_WorldStatic);
    TriggerBox->SetCollisionResponseToAllChannels(ECR_Ignore);
    TriggerBox->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap);
}

Step 2: Bind the overlap delegate in BeginPlay. Make sure the binding uses the correct signature and AddDynamic macro.

void ATriggerZone::BeginPlay()
{
    Super::BeginPlay();

    // Bind the overlap event
    TriggerBox->OnComponentBeginOverlap.AddDynamic(this, &ATriggerZone::OnOverlapBegin);
}

void ATriggerZone::OnOverlapBegin(UPrimitiveComponent* OverlappedComp, AActor* OtherActor,
    UPrimitiveComponent* OtherComp, int32 OtherBodyIndex,
    bool bFromSweep, const FHitResult& SweepResult)
{
    if (OtherActor && OtherActor != this)
    {
        UE_LOG(LogTemp, Log, TEXT("Overlap with: %s"), *OtherActor->GetName());
    }
}

Step 3: Verify the other actor also generates overlap events. On your character or pawn, ensure the capsule component has overlap generation enabled.

// In your character constructor, verify these settings
AMyCharacter::AMyCharacter()
{
    // The capsule component must also generate overlaps
    GetCapsuleComponent()->SetGenerateOverlapEvents(true);

    // Diagnostic: log collision settings at startup
    UE_LOG(LogTemp, Log, TEXT("Capsule overlap events: %s"),
        GetCapsuleComponent()->GetGenerateOverlapEvents() ? TEXT("ON") : TEXT("OFF"));
}

Related Issues

If overlaps work but your AI is not navigating to the trigger zone, see our guide on AI MoveTo not working. If you are trying to change a material when the player enters a trigger zone and the material is not updating, check out material instances not updating at runtime.

Both sides need Generate Overlap Events. Both sides. Always.