Ran into this myself and haven’t found anyone answering this. Object traces don’t have a notion of overlap vs blocking. It kinda makes sense, what would it check? It seems like it would be object response, but remember that’s how other objects respond to it. So it’s not the same as trace channels. Here’s the relevant code in CollisionQueryFilterCallback.cpp
const uint32 ShapeBit = ECC_TO_BITFIELD(ShapeChannel);
if (QueryType == ECollisionQuery::ObjectQuery)
{
const int32 MultiTrace = (int32)QuerierChannel;
// do I belong to one of objects of interest?
if (ShapeBit & QueryFilter.Word1)
{
if (bPreFilter) //In the case of an object query we actually want to return all object types (or first in single case). So in PreFilter we have to trick physx by not blocking in the multi case, and blocking in the single case.
{
return MultiTrace ? ECollisionQueryHitType::Touch: ECollisionQueryHitType::Block;
}
else
{
return ECollisionQueryHitType::Block; //In the case where an object query is being resolved for the user we just return a block because object query doesn't have the concept of overlap at all and block seems more natural
}
}
}
In other words, object traces will always return hitresults with IsBlocking set to true.