Looks very complex. Here are some general observations you may wish to consider:
- You are trying too hard to be realistic. Don’t. Games simulate a lot of stuff, embrace that. Implementing collision spheres in your hands is not going to work very well with constant movement. It will keep firing as many times as these overlap. The reason why it applies several times (more if you move) is because you overlap several times with the animation and movement. Fake it instead. Implement along these lines (copy and paste from one of my projects).
- Check for the right targets using some sort of interface. See my example above. You can implement “IsDamageable?” Interface. It will scale much better, and will be much easier to manage than using tags.