Set up some actor to have a primitive to detect overlaps and the appropriate ‘OnComponentBeginOverlap’ and ‘OnComponentEndOverlap’ functions.
For the intruding actor, set ‘Collision Presets’ to ‘Custom’. Set ‘Collision Enabled’ to ‘Physics Only (No Query Collision)’. ‘Object Type’ doesn’t matter but I have it at ‘PhysicsBody’. Then make sure ‘WorldDynamic’ is set to Block.
What you’ll see is begin overlap and end overlap called every frame as long as the intruding actor is within the radius, and none firing when he’s out. Even though this setup might be unusual, it happened in my game the very first time I set it up.
Debugging the source, the code that checks for BeginOverlap just checks that ‘WorldDynamic’ is set to ‘Block’. The EndOverlap checks for Collision to be set to ‘Query Only’ or ‘Collision Enabled (Query and Physics)’ (because otherwise CollisionEnabled is set to false). Consequently every frame you’re in range, you BeginOverlap, then EndOverlap, and loops every frame. Seems like a bug to me because the conditions that send you into a state are different from the ones that release you from that state, opening the door to endless cycles.
UPrimitiveComponent::UpdateOverlaps checks to see if the object causing the overlap has collisions enabled (as in 'query only or query and physics). If it doesn’t, it calls EndComponentOverlap on all overlaps it has.
Otherwise, a warning would be nice at the very least. Took me a while to narrow this down.