Thanks for @cybereality 's hint! I took the idea from your replies and finally make it! For future comers that interested to this topic, you can view this branch of this fork: https://github.com/ailisp/godot-3d-mannequin/tree/fight
Basically the upstream repo has a human, it can run but head would overlap with the wall (no collision is detected there).
My branch improvement:
Head doesn't overlap with the wall, and it's for every animation, head collision moves together with the head bone
Add an attack, by pressing "J", and if the right hand fist hit the wall, player will be bounce back
For a high level overview on how this is made:
Add bone attachment to Skeleton, select bone attachment property to attach to head/hand bone, this will move attached objects as animation moves
Add Area as sub node of bone attachment, add CollisionShape to Area that roughly match head and fist's shape
Connect Area enter body / leave body to set / clear a flag variable to indicate collision happening
In physics process check that flag variable and if collide, move_and_slide player accordingly
Some caveat i run into:
must set Collision Layer/Mask of Player to not collide with player, because area is attached to player body, if not set it's always considered as colliding
must set physics fps to 120, otherwise head area still overlap with wall than bounce back.