# Unity / Animation / Change the “Transition Speed” between 2 animations during runtime

I need to change the Transition Duration per Runtime. I just didnt find a way to do access it. I found questions with similar problems though (links below)- those didnt work for me because they accessed it to change it via editor - script. But I need it in runtime. Is that even possible?

https://stackoverflow.com/questions/29315507/unity-5-access-modify-animatorcontroller-from-c-sharp-script-in-editor

• afaik you can't change most of those values in code. (I'm sure for animation speed) I suggest you define multiple states with different durations. – Bizhan Jan 16 '17 at 13:54
• animation speed CAN be changed - with a "multiplier". – OC_RaizW Jan 16 '17 at 14:50
• Oh! I see, I need to look into it. I hope you find your answer. – Bizhan Jan 16 '17 at 15:17

Alright so this was a difficult question that I had to do some thorough research on. To access the transition duration of a certain state you have to go through the animation controller, then find the right layer, then find the right state on that layer, then access the correct transition in that state. After all this you can then change the transition duration. Now you said you wanted the duration per runtime, in order to do anything per runtime in the animation controller I believe you would have to access the Animator class' runtimeAnimatorController. This class has limited abilities and you can not access even the layers, much less a state's transition duration so you have to use the "as" keyword to change it into a normal AnimatorController class. Now you can change the necessary values per runtime. The code would look something like this. (The majority of this code is to help you find the transition you wish to change)

void ChangeTransitionDuration(float value)
{
// Get a reference to the Animator Controller:
UnityEditor.Animations.AnimatorController ac = GetComponent<Animator>().runtimeAnimatorController as UnityEditor.Animations.AnimatorController;
//This part is IMPORTANT ^^

// Number of layers:
int layerCount = ac.layers.Length;
Debug.Log(string.Format("Layer Count: {0}", layerCount));

// Names of each layer:
for (int layer = 0; layer < layerCount; layer++)
{
Debug.Log(string.Format("Layer {0}: {1}", layer, ac.layers[layer].name));
}

// States on layer 0:
UnityEditor.Animations.AnimatorStateMachine sm = ac.layers[0].stateMachine;
UnityEditor.Animations.ChildAnimatorState[] states = sm.states;
foreach (UnityEditor.Animations.ChildAnimatorState s in states)
{
Debug.Log(string.Format("State: {0}", s.state.name));
}

// Access the duration variable to change it
ac.layers[desiredLayer].stateMachine.states[desiredState].state.transitions[desiredTransition].duration = desiredValue;
// You can split this up into different variables if you like
// I just wrote it all on one line so you could see the path to take
}