Crossfade not making sense to me

So here, Crossfade is doing nothing. I see people have fixes like set wrapMode to something but what is never explained is WHY. The documentation lists something pretty much the same, only it isn’t as cut and paste as what it says works. Crossfade shouldn’t have any hidden settings to make it work. Pretty much,

void Awake()
{
    //this.animation["SL_H_C"].weight = 1.0f;
    //this.animation["RL_H_C"].weight = 1.0f;

    this.animation["SL_H_C"].wrapMode = WrapMode.Loop;
    this.animation["RL_H_C"].wrapMode = WrapMode.Once;

    this.animation["SL_H_C"].layer = 0;
    this.animation["RL_H_C"].layer = 1;
}

void Update()
{
    if (Input.GetAxis("Vertical") > 0.2f)
    {
        this.animation.CrossFade("SL_H_C");
    }

    if (Input.GetAxis("Horizontal") > 0.2f)
    {   

        this.animation.CrossFade("RL_H_C");
    }

    Debug.Log("SL IS: " + this.animation["SL_H_C"].weight.ToString("0.0000"));
    Debug.Log("RL IS: " + this.animation["RL_H_C"].weight.ToString("0.0000"));
}

The confusion here is two things.

“SL_H_C” should be 0 when “RL_H_C” is fully 1. This isn’t the case. “SL_H_C” never goes down from 1 and once “RL_H_C” hits 1, it immediately goes down to 0. To my belief, “RL_H_C” should stick to having full control and the loop should stop since it contributes 0 weight to the animation. However, this is not the case here.

Crossfade only fades out anims on the same layer, and leaves other layers alone. By putting SL and RL on diff layers, you’re purposely saying they shouldn’t interact with CrossFade. Also, a “hidden” animation doesn’t stop. Once you play SL, it gets covered up by HL on layer 1, but when HL stops (Loops never stop, but PlayOnce does,) SL is still there playing and “shows through” again.

Here’s the reason for that rule:

Suppose your arms have idle, walk, run and also some “signalling” PlayOnce motions. You put idle/walk/run all on one layer, and signalling all on some same higher layer. You can switch between run/idle/walk without worrying about cancelling a surrender. You can play point-left and have it cancel point-right, but not cancel run (it will “hide” the run, but when you are done pointing, your arms automatically go back to running.)

SetWrapMode is always obvious. Shooting is playOnce. If you have machinegun mode, which you have to cancel out of, then clearly shooting should be Loop. Idle is loop, unless you want to sometimes trigger a single head-bob – then it’s clearly PlayOnce. All you have to think about is “do I want Play to make this go over and over?”

I’m not sure weight is related to the crossfade progression. I think it’s more how it affects the mesh when it’s playing. But I’m confused as well so …