Example #1
0
        private CombinedAnimatorState AddState(AnimatorState animatorState, CombinedAnimatorState parent, AnimatorControllerLayer layer, ActionSet actionSet)
        {
            CombinedAnimatorState state = new CombinedAnimatorState(animatorState, layer);

            state.Layer             = layer;
            state.ActionSet         = actionSet;
            state.Parent            = parent;
            m_States[animatorState] = state;
            return(state);
        }
Example #2
0
 private void OnGUI()
 {
     if (m_AnimatorController == null)
     {
         GUILayout.Label("Please select an animator controller.");
         m_AnimatorController = (AnimatorController)EditorGUILayout.ObjectField(m_AnimatorController, typeof(AnimatorController));
         if (null != m_AnimatorController)
         {
             Index();
         }
     }
     else
     {
         // TODO: This will probably need to move out and shouldn't be done
         // every frame. Performing fine for now.
         scroll = GUILayout.BeginScrollView(scroll); {
             stateCollection = (AnimationStateCollection)EditorGUILayout.ObjectField(stateCollection, typeof(AnimationStateCollection));
             if (currentSelection is AnimatorStateTransition)
             {
                 DrawAnimatorTransition(currentSelection as AnimatorStateTransition, foldout: false);
             }
             else if (currentSelection is AnimatorStateMachine)
             {
                 CombinedAnimatorState state = m_States.ContainsKey(currentSelection) ? m_States[currentSelection] : null;
                 if (state.Parent == null)
                 {
                     DrawRootController();
                 }
                 else
                 {
                     DrawAnimatorStateMachine(currentSelection as AnimatorStateMachine);
                 }
             }
             else if (currentSelection is AnimatorState)
             {
                 DrawAnimatorState(currentSelection as AnimatorState);
             }
             else
             {
                 DrawRootController();
             }
         } GUILayout.EndScrollView();
     }
 }
Example #3
0
        private CombinedAnimatorState AddState(AnimatorStateMachine stateMachine, CombinedAnimatorState parent, AnimatorControllerLayer layer, ActionSet actionSet, bool addChildren = true)
        {
            CombinedAnimatorState state = new CombinedAnimatorState(stateMachine, layer);

            state.Layer            = layer;
            state.ActionSet        = actionSet;
            state.Parent           = parent;
            m_States[stateMachine] = state;
            if (addChildren)
            {
                foreach (ChildAnimatorState child in stateMachine.states)
                {
                    AddState(child.state, state, layer, actionSet);
                }
                foreach (ChildAnimatorStateMachine child in stateMachine.stateMachines)
                {
                    AddState(child.stateMachine, state, layer, actionSet);
                }
            }
            return(state);
        }
Example #4
0
        private string GetTransitionLabel(AnimatorTransitionBase transition, CombinedAnimatorState state = null, string source = null)
        {
            string label = (source ?? "Self") + " -> ";

            if (null != state && state.HasTransition(transition))
            {
                label += "Self";
            }
            else if (null != transition.destinationState)
            {
                label += transition.destinationState.name;
            }
            else if (null != transition.destinationStateMachine)
            {
                label += transition.destinationStateMachine.name;
            }
            else if (transition.isExit)
            {
                label += "Exit";
            }
            return(label);
        }
Example #5
0
        private void DrawState(CombinedAnimatorState state, bool showHeader = true, string headerLabel = null)
        {
            if (showHeader)
            {
                GUILayout.Label(headerLabel ?? state.Name);
            }

            foreach (AnimatorTransitionBase transition in state.AnyStateTransitions)
            {
                GUILayout.BeginVertical(EditorStyles.helpBox);
                DrawAnimatorTransition(transition, "Any State", state);
                GUILayout.EndVertical();
                GUILayout.Space(8);
            }
            foreach (AnimatorTransitionBase transition in state.EntryTransitions)
            {
                GUILayout.BeginVertical(EditorStyles.helpBox);
                DrawAnimatorTransition(transition, "Entry", state);
                GUILayout.EndVertical();
                GUILayout.Space(8);
            }
            foreach (AnimatorTransitionBase transition in state.Transitions)
            {
                GUILayout.BeginVertical(EditorStyles.helpBox);
                DrawAnimatorTransition(transition, sourceState: state);
                GUILayout.EndVertical();
                GUILayout.Space(8);
            }
            foreach (ChildAnimatorState childState in state.ChildStates)
            {
                DrawAnimatorState(childState.state);
            }
            foreach (ChildAnimatorStateMachine childState in state.ChildStateMachines)
            {
                DrawAnimatorStateMachine(childState.stateMachine);
            }
        }
Example #6
0
 private void Index()
 {
     m_AnimatorGroups.Clear();
     if (m_AnimatorController != null)
     {
         foreach (AnimatorControllerLayer layer in m_AnimatorController.layers)
         {
             m_Layers[layer.name] = layer;
             CombinedAnimatorState layerState = AddState(layer.stateMachine, null, layer, null, false);
             foreach (ChildAnimatorStateMachine stateMachine in layerState.ChildStateMachines)
             {
                 CombinedAnimatorState groupState = AddState(stateMachine.stateMachine, layerState, layer, null, false);
                 AnimatorGroup         group      = CollectionUtil.GetOrAdd(m_AnimatorGroups, stateMachine.stateMachine.name);
                 group.Name = stateMachine.stateMachine.name;
                 group.AddLayer(layer);
                 foreach (ChildAnimatorStateMachine actionMachine in stateMachine.stateMachine.stateMachines)
                 {
                     ActionSet actionSet = CollectionUtil.GetOrAdd(group.Actions, actionMachine.stateMachine.name);
                     actionSet.Name = actionMachine.stateMachine.name;
                     actionSet.Layers[layer.name] = layer;
                     CombinedAnimatorState state = AddState(actionMachine.stateMachine, groupState, layer, actionSet);
                     actionSet.States.Add(state);
                 }
                 foreach (ChildAnimatorState actionState in stateMachine.stateMachine.states)
                 {
                     ActionSet actionSet = CollectionUtil.GetOrAdd(group.Actions, actionState.state.name);
                     actionSet.Name = actionState.state.name;
                     actionSet.Layers[layer.name] = layer;
                     CombinedAnimatorState state = AddState(actionState.state, groupState, layer, actionSet);
                     actionSet.States.Add(state);
                     m_States[actionState.state] = state;
                 }
             }
         }
     }
 }
Example #7
0
        private void DrawAnimatorTransition(AnimatorTransitionBase transition, string source = null, CombinedAnimatorState sourceState = null, bool foldout = true)
        {
            // This is ugly. Apparently you can't modify the collection directly.
            // The only way I found that worked was to remove conditions and readd
            // on modification. There must be a better way to do it.
            // TODO: Do this the right way.
            List <AnimatorCondition> conditions = new List <AnimatorCondition>();
            bool modified = false;

            string label = GetTransitionLabel(transition, sourceState, source);

            GUILayout.BeginHorizontal();
            {
                if (foldout)
                {
                    foldouts[transition] = EditorGUILayout.Foldout(CollectionUtil.GetOrAdd(foldouts, transition, false), label);
                }
                else
                {
                    GUILayout.Label(label);
                }
                if (!foldout || foldouts[transition])
                {
                    GUILayout.FlexibleSpace();
                    if (GUILayout.Button("+", InspectorStyles.NoPaddingButtonStyle, GUILayout.Width(16), GUILayout.Height(16)))
                    {
                        AnimatorCondition condition = new AnimatorCondition();
                        condition.parameter = parameterNames[0];
                        conditions.Add(condition);
                        modified = true;
                    }
                }
            }
            GUILayout.EndHorizontal();

            if (!foldout || foldouts[transition])
            {
                for (int i = 0; i < transition.conditions.Length; i++)
                {
                    var  condition = transition.conditions[i];
                    bool remove;
                    if (DrawAnimatorCondition(ref condition, out remove))
                    {
                        if (!remove)
                        {
                            conditions.Add(condition);
                        }
                        modified = true;
                    }
                    else
                    {
                        conditions.Add(transition.conditions[i]);
                    }
                }

                if (modified)
                {
                    while (transition.conditions.Length > 0)
                    {
                        transition.RemoveCondition(transition.conditions[0]);
                    }

                    foreach (AnimatorCondition condition in conditions)
                    {
                        transition.AddCondition(condition.mode, condition.threshold, condition.parameter);
                    }
                }
            }
        }