Search Unity

  1. Good news ✨ We have more Unite Now videos available for you to watch on-demand! Come check them out and ask our experts any questions!
    Dismiss Notice
  2. Ever participated in one our Game Jams? Want pointers on your project? Our Evangelists will be available on Friday to give feedback. Come share your games with us!
    Dismiss Notice

Find all Animator transitions

Discussion in 'Immediate Mode GUI (IMGUI)' started by FeastSC2, Jun 1, 2017.

  1. FeastSC2

    FeastSC2

    Joined:
    Sep 30, 2016
    Posts:
    865
    I'm creating a 2d game and the animation transitions 's exit time and transition durations are set to numbers which I don't want i.e not 1 for exit time and 0 for transition duration.

    How to find and set all the transitions' settings (animation duration/ exit time) of a given animator programmatically?
     
  2. FeastSC2

    FeastSC2

    Joined:
    Sep 30, 2016
    Posts:
    865
    Ok I found a decent way
    Code (CSharp):
    1.  
    2. var stateMachine = _animatorController.layers[0].stateMachine;
    3.             var states = stateMachine.states;
    4.  
    5.             List<AnimatorStateTransition> allTransitions = new List<AnimatorStateTransition>();
    6.             foreach (var state in states)
    7.             {
    8.                 allTransitions.AddRange(state.state.transitions);
    9.             }
    10.  
    11.             foreach (var transition in allTransitions)
    12.             {
    13.                 transition.duration = 0;
    14.                 transition.exitTime = 1;
    15.             }
    16.  
    17.  
    The _animatorController is something I feed to my Editor Window with:
    _animatorController = (AnimatorController)EditorGUILayout.ObjectField(_animatorController,
    typeof(AnimatorController), true);

    I don't know how to do this automatically every time a new transition is created, probably through events but I'm not familiar with that kind of stuff, so right now what I do is simply clean the specific Animator Controller.
    You could also get every Animation Controller in the project to do on every Animation Controller.
     
  3. OC_Raiz

    OC_Raiz

    Joined:
    Jul 4, 2016
    Posts:
    4
    thanks. what class are these "var's"?
    a bit unreadable
    _animatorController is it a "RuntimeAnimatorController"?
    or an "Animator"?
    Or something entirely else?

    Animator and RuntimeAnimatorController dont have a "layers" array.
     
  4. FeastSC2

    FeastSC2

    Joined:
    Sep 30, 2016
    Posts:
    865
    _animatorController is AnimatorController (class).
     
  5. Ben_Iyan

    Ben_Iyan

    Joined:
    May 13, 2016
    Posts:
    193
    I know this is an old thread, but it was one of the first Google hits that I got. So, for anyone like @OC_Raiz that's interested, this is my code. Hope it helps.

    Code (CSharp):
    1. var controller = animator.runtimeAnimatorController;
    2.             var stateMachine = ((AnimatorController)controller).layers[layerIndex].stateMachine;
    3.             var states = stateMachine.states;
    4.  
    5.             List<AnimatorStateTransition> allTransitions = new List<AnimatorStateTransition>();
    6.             foreach (var state in states)
    7.             {
    8.                 allTransitions.AddRange(state.state.transitions);
    9.             }
    10.  
    11.             foreach (var transition in allTransitions)
    12.             {
    13.                 transition.duration = 0;
    14.                 transition.exitTime = 1;
    15.            }    
     
    CyrilGhys and ItachiTGM like this.
  6. olejuer

    olejuer

    Joined:
    Dec 1, 2014
    Posts:
    130
    I have build this utility MonoBehaviour that automatically modifies all transitions in OnValidate

    Code (CSharp):
    1.  
    2. [RequireComponent(typeof(Animator))]
    3. public class StateAnimator : MonoBehaviour
    4. {
    5.     private Animator _animator;
    6.  
    7.     private void OnValidate()
    8.     {
    9.         _animator = GetComponent<Animator>();
    10.         var animatorController = _animator.runtimeAnimatorController as AnimatorController;
    11.         if (animatorController == null) return;
    12.         foreach (AnimatorStateTransition transition in animatorController.layers
    13.             .SelectMany(layer => layer.stateMachine.states.SelectMany(state => state.state.transitions)))
    14.         {
    15.             transition.duration = 0f;
    16.             transition.hasExitTime = false;
    17.         }
    18.     }
    19. }
    20.  
     
    CyrilGhys likes this.
unityunity