No callback received for ReceiveHit or OnComponentHit

Hi.

I am on UE 4.5.

I have the following two actors configured as shown in the screenshot below. Both actors have SimulatePhysics = true and SimulationGenerateHitEvents = true on their RootComponent which is BoxComponent (collider). The StaticMeshComponent inside the [Root] has collisions disabled.

Actor1 is of type WorldStatic listening for Hit events when collided with the playerBullet. playerBullet is a custom trace channel.
Actor2 is of type playerBullet that the player fires toward Actor1. When they come in contact none of the mentioned events gets fired :(.

However, if I change the collision response to overlap, I receive the following callback without any problem:

virtual void ReceiveActorBeginOverlap(AActor* OtherActor) OVERRIDE;

In C++ code, I override the ReceiveHit method

virtual void ReceiveHit(class UPrimitiveComponent* MyComp, AActor* Other, class UPrimitiveComponent* OtherComp, bool bSelfMoved, FVector HitLocation, FVector HitNormal, FVector NormalImpulse, const FHitResult& Hit) OVERRIDE;

And, hooked the OnComponentHit as below

void AAIBeaconConnection::PostInitializeComponents()
{
    Super::PostInitializeComponents();

    Collider = Cast<UBoxComponent>(RootComponent);
    Collider->OnComponentHit.AddDynamic(this, &AAIBeaconConnection::OnHit);
}

I tried several other combinations but fail to get any of these events. I could work with overlap events but I would like to establish a clear distinction between blocking and non-blocking gameobjects in my game.

Any help is greatly appreciated!!

Just in case it’s something silly… are you by chance using the event in Blueprint and forgetting to add a parent call?

No. I am not using it in the blueprint. Its all in C++. This blueprint is created from a custom class AIBeaconConnection which extends from AActor.

This is really bizarre that this is not working.

So it looks like the solution described in the following thread works:

I do get both events (ReceiveHit and OnComponentHit) once I pass true as a second argument in my SetActorLocation() call.

I am not sure if its a bad function design but WHY setting the actor location is controlling which collision callbacks to call? This is really weird.