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); }
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(); } }
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); }
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); }
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); } }
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; } } } } }
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); } } } }