The details need attention, as always, and there are often more than a single way to do things.
For forward movement, how is the frame determined for all of the animations? Is there an animation frame index for each of the 3 at once, or are they expected to all be the same length and match. So at frame 5 the right leg is up in walk and the right leg is also up in the run animation. Otherwise the blending wouldn't work?
Let the moveWalk animation have a length of 2 seconds for a single cycle. After this 2 seconds the animation loops and hence starts at the beginning. If forwardSpeed has the value of 3, the animation is played at nominal speed, i.e. one cycle in 2 * 3 / 3 = 2 seconds. If forwardSpeed is 1.5 (the half value), then the full cycle of the animation need to be played in 2 * 3 / 1.5 = 4 seconds (the double value). If forwardSpeed has the value of 4.5, the full cycle lasts 2 * 3 / 4.5 = 1.33 seconds. This means that the animation is played back with an adapted speed.
The same is true for the moveRun animation, but here the duration of a cycle is, say, 1 second. Again, this duration is defined for the nominal forwardSpeed of 6. So, when forwardSpeed is 4.5, the full cycle just lasts for 1 * 6 / 4.5 = 1.33 seconds which is, not by accident, the same duration of a full cycle of moveWalk when forwardSpeed is 4.5.
Fine so far, but not enough to make the animation look good when moveWalk and moveRun are blended. It is also required that the both animation run in the same motion phase. E.g. both animations have the left foot on the ground at the beginning and at the end of the cycle, and both have the right foot on the ground in the middle of the cycle. In other words, both animations are in the same motion phase for a given percentage of the cycle.
How keyframes are distributed over a cycle is not important in this sense. Both the cycles of moveWalk and moveRun may have a different count and/or spacing of keyframes. The distribution of keyframes depends only on the question of motion quality. Thing is, you need to use the accordingly adapted animation time.
For the meleeAttack, when the condition is false it does 2 things, 1) it doesn't blend anything into the animation 2) it sets the frame index to -1, so when the condition becomes true and the frame is incremented it'll be "0"?
1) Yes, the meleeAttack is needed to be suppressed.
2) When the animation is triggered, its local playback time can be reset, so ever staring at 0.
So rather than using a state machine to manage the animation, it'd be possible to use a state machine to manage the objects state. So if i am in a state "climbing wall", that state would make sure meleeAttack's condition is set to false as you can't melee while climbing a wall?
It is okay to combine all this with a state machine, where blend trees are embedded in nodes. For example, "normal" and "climbing" are states, where the state "climbing" may be entered only if forwardSpeed is 0, so that the "normal" state would show idleStand.