I am not aware of any built in engine solution for this, however I believe you can save a lot of performance by checking a few select points when you need, rather than adding new components that will cause additional collision calculations all the time.
PrimitiveComponent provides the following function which can be helpful in this case :
/**
* Returns the distance and closest point to the collision surface.
* Component must have simple collision to be queried for closest point.
*
* @param Point World 3D vector
* @param OutPointOnBody Point on the surface of collision closest to Point
* @param BoneName If a SkeletalMeshComponent, name of body to set center of mass of. 'None' indicates root body.
*
* @return Success if returns > 0.f, if returns 0.f, it is either not convex or inside of the point
* If returns < 0.f, this primitive does not have collsion
*/
UFUNCTION(BlueprintCallable, Category = "Collision", meta=(UnsafeDuringActorConstruction="true"))
float GetClosestPointOnCollision(const FVector& Point, FVector& OutPointOnBody, FName BoneName = NAME_None) const;
I am not sure myself what the BoneName parameter really does, but ignoring that you can use this to check if a selection of bones/sockets on your character are overlapping the collision primitive or not.
Here is a quick blueprint prototype :
I’m using a sphere collision component, but should work with any primitive component.
Note that I didn’t bother selecting specific sockets and used all of them, mannequin has like 70 sockets, but it’s good enough for prototyping.
In your case I suggest you predefine an array of relevant sockets to check (add some in the skeleton if necessary).