Ejemplo n.º 1
0
 Transition(
     AnimatorState destination      = null,
     AnimatorCondition[] conditions = null,
     bool hasExitTime      = false,
     bool canTransitToSelf = false,
     float duration        = 0,
     float exitTime        = 0,
     bool hasFixedDuration = true,
     float offset          = 0,
     TransitionInterruptionSource interruptionSource =
     TransitionInterruptionSource.None,
     bool orderedInterruption = true
     ) =>
 new AnimatorStateTransition
 {
     destinationState = destination,
     conditions       = conditions,
     hasExitTime      = hasExitTime ||
                        conditions == null ||
                        conditions.Length == 0,
     duration            = duration,
     exitTime            = exitTime,
     hasFixedDuration    = hasFixedDuration,
     offset              = offset,
     interruptionSource  = interruptionSource,
     orderedInterruption = orderedInterruption,
     canTransitionToSelf = canTransitToSelf,
     isExit              = destination == null
 };
Ejemplo n.º 2
0
        protected override void DoPreview()
        {
            this.Init();
            AnimatorStateTransition targetObject     = base.m_SerializedTransition.targetObject as AnimatorStateTransition;
            AnimatorState           sourceState      = this.GetSourceState((base.m_TransitionList == null) ? 0 : base.m_TransitionList.index);
            AnimatorState           destinationState = targetObject.destinationState;

            EditorGUILayout.PropertyField(this.m_HasExitTime, styles.hasExitTime, new GUILayoutOption[0]);
            m_ShowSettings = EditorGUILayout.Foldout(m_ShowSettings, "Settings");
            if (m_ShowSettings)
            {
                EditorGUI.indentLevel++;
                bool enabled = GUI.enabled;
                GUI.enabled = this.m_HasExitTime.boolValue;
                EditorGUILayout.PropertyField(this.m_ExitTime, styles.exitTime, new GUILayoutOption[0]);
                GUI.enabled = enabled;
                EditorGUILayout.PropertyField(this.m_HasFixedDuration, styles.hasFixedDuration, new GUILayoutOption[0]);
                EditorGUILayout.PropertyField(this.m_Duration, !this.m_HasFixedDuration.boolValue ? styles.transitionDurationNormalized : styles.transitionDurationFixed, new GUILayoutOption[0]);
                EditorGUILayout.PropertyField(this.m_Offset, styles.transitionOffset, new GUILayoutOption[0]);
                EditorGUILayout.PropertyField(this.m_InterruptionSource, styles.interruptionSource, new GUILayoutOption[0]);
                TransitionInterruptionSource enumValueIndex = (TransitionInterruptionSource)this.m_InterruptionSource.enumValueIndex;
                GUI.enabled = ((enumValueIndex == TransitionInterruptionSource.Source) || (enumValueIndex == TransitionInterruptionSource.SourceThenDestination)) || (enumValueIndex == TransitionInterruptionSource.DestinationThenSource);
                EditorGUILayout.PropertyField(this.m_OrderedInterruption, styles.orderedInterruption, new GUILayoutOption[0]);
                GUI.enabled = enabled;
                if ((sourceState == null) && (destinationState != null))
                {
                    EditorGUILayout.PropertyField(this.m_CanTransitionToSelf, new GUILayoutOption[0]);
                }
                EditorGUI.indentLevel--;
            }
            if (this.IsPreviewable())
            {
                AnimatorStateMachine stateMachine = base.m_Controller.layers[base.m_LayerIndex].stateMachine;
                if (sourceState == null)
                {
                    List <ChildAnimatorState> statesRecursive = stateMachine.statesRecursive;
                    string[] displayedOptions = new string[statesRecursive.Count];
                    int      num = 0;
                    foreach (ChildAnimatorState state3 in statesRecursive)
                    {
                        displayedOptions[num++] = state3.state.name;
                    }
                    EditorGUILayout.Space();
                    this.m_AnyStateSourceIndex = EditorGUILayout.Popup("Preview source state", this.m_AnyStateSourceIndex, displayedOptions, new GUILayoutOption[0]);
                    EditorGUILayout.Space();
                    ChildAnimatorState state4 = statesRecursive[this.m_AnyStateSourceIndex];
                    sourceState = state4.state;
                }
                if (destinationState == null)
                {
                    if (this.m_DstStates.Count > 0)
                    {
                        string[] strArray2 = new string[this.m_DstStates.Count];
                        int      num2      = 0;
                        foreach (AnimatorState state5 in this.m_DstStates)
                        {
                            strArray2[num2++] = state5.name;
                        }
                        EditorGUILayout.Space();
                        this.m_DstStateIndex = EditorGUILayout.Popup("Preview destination state", this.m_DstStateIndex, strArray2, new GUILayoutOption[0]);
                        if (this.m_DstStates.Count > this.m_DstStateIndex)
                        {
                            destinationState = this.m_DstStates[this.m_DstStateIndex];
                        }
                        else
                        {
                            destinationState = null;
                        }
                        EditorGUILayout.Space();
                    }
                    else
                    {
                        EditorGUILayout.HelpBox("Cannot preview transition, there is no destination state", MessageType.Warning, true);
                    }
                }
                if ((sourceState != null) && (destinationState != null))
                {
                    this.m_TransitionPreview.SetTransition(targetObject, sourceState, destinationState, base.m_Controller.layers[base.m_LayerIndex], base.m_PreviewObject);
                    this.m_TransitionPreview.DoTransitionPreview();
                }
            }
            else
            {
                EditorGUILayout.HelpBox(this.m_InvalidTransitionMessage, MessageType.Warning, true);
            }
        }
Ejemplo n.º 3
0
        protected override void DoPreview()
        {
            this.Init();
            AnimatorStateTransition animatorStateTransition = this.m_SerializedTransition.targetObject as AnimatorStateTransition;
            AnimatorState           animatorState           = this.GetSourceState((this.m_TransitionList == null) ? 0 : this.m_TransitionList.index);
            AnimatorState           animatorState2          = animatorStateTransition.destinationState;

            EditorGUILayout.PropertyField(this.m_HasExitTime, AnimatorStateTransitionInspector.styles.hasExitTime, new GUILayoutOption[0]);
            AnimatorStateTransitionInspector.m_ShowSettings = EditorGUILayout.Foldout(AnimatorStateTransitionInspector.m_ShowSettings, "Settings");
            if (AnimatorStateTransitionInspector.m_ShowSettings)
            {
                EditorGUI.indentLevel++;
                bool enabled = GUI.enabled;
                GUI.enabled = this.m_HasExitTime.boolValue;
                EditorGUILayout.PropertyField(this.m_ExitTime, AnimatorStateTransitionInspector.styles.exitTime, new GUILayoutOption[0]);
                GUI.enabled = enabled;
                EditorGUILayout.PropertyField(this.m_HasFixedDuration, AnimatorStateTransitionInspector.styles.hasFixedDuration, new GUILayoutOption[0]);
                EditorGUILayout.PropertyField(this.m_Duration, (!this.m_HasFixedDuration.boolValue) ? AnimatorStateTransitionInspector.styles.transitionDurationNormalized : AnimatorStateTransitionInspector.styles.transitionDurationFixed, new GUILayoutOption[0]);
                EditorGUILayout.PropertyField(this.m_Offset, AnimatorStateTransitionInspector.styles.transitionOffset, new GUILayoutOption[0]);
                EditorGUILayout.PropertyField(this.m_InterruptionSource, AnimatorStateTransitionInspector.styles.interruptionSource, new GUILayoutOption[0]);
                TransitionInterruptionSource enumValueIndex = (TransitionInterruptionSource)this.m_InterruptionSource.enumValueIndex;
                GUI.enabled = (enumValueIndex == TransitionInterruptionSource.Source || enumValueIndex == TransitionInterruptionSource.SourceThenDestination || enumValueIndex == TransitionInterruptionSource.DestinationThenSource);
                EditorGUILayout.PropertyField(this.m_OrderedInterruption, AnimatorStateTransitionInspector.styles.orderedInterruption, new GUILayoutOption[0]);
                GUI.enabled = enabled;
                if (animatorState == null && animatorState2)
                {
                    EditorGUILayout.PropertyField(this.m_CanTransitionToSelf, new GUILayoutOption[0]);
                }
                EditorGUI.indentLevel--;
            }
            if (this.IsPreviewable())
            {
                AnimatorStateMachine stateMachine = this.m_Controller.layers[this.m_LayerIndex].stateMachine;
                if (animatorState == null)
                {
                    List <ChildAnimatorState> statesRecursive = stateMachine.statesRecursive;
                    string[] array = new string[statesRecursive.Count];
                    int      num   = 0;
                    foreach (ChildAnimatorState current in statesRecursive)
                    {
                        array[num++] = current.state.name;
                    }
                    EditorGUILayout.Space();
                    this.m_AnyStateSourceIndex = EditorGUILayout.Popup("Preview source state", this.m_AnyStateSourceIndex, array, new GUILayoutOption[0]);
                    EditorGUILayout.Space();
                    animatorState = statesRecursive[this.m_AnyStateSourceIndex].state;
                }
                if (animatorState2 == null)
                {
                    if (this.m_DstStates.Count > 0)
                    {
                        string[] array2 = new string[this.m_DstStates.Count];
                        int      num2   = 0;
                        foreach (AnimatorState current2 in this.m_DstStates)
                        {
                            array2[num2++] = current2.name;
                        }
                        EditorGUILayout.Space();
                        this.m_DstStateIndex = EditorGUILayout.Popup("Preview destination state", this.m_DstStateIndex, array2, new GUILayoutOption[0]);
                        if (this.m_DstStates.Count > this.m_DstStateIndex)
                        {
                            animatorState2 = this.m_DstStates[this.m_DstStateIndex];
                        }
                        else
                        {
                            animatorState2 = null;
                        }
                        EditorGUILayout.Space();
                    }
                    else
                    {
                        EditorGUILayout.HelpBox("Cannot preview transition, there is no destination state", MessageType.Warning, true);
                    }
                }
                if (animatorState != null && animatorState2 != null)
                {
                    this.m_TransitionPreview.SetTransition(animatorStateTransition, animatorState, animatorState2, this.m_Controller.layers[this.m_LayerIndex], this.m_PreviewObject);
                    this.m_TransitionPreview.DoTransitionPreview();
                }
            }
            else
            {
                EditorGUILayout.HelpBox(this.m_InvalidTransitionMessage, MessageType.Warning, true);
            }
        }
        public TransitionInspector()
        {
            text = "Transition";

            _scrollView = new ScrollView(ScrollViewMode.Vertical);
            _scrollView.AddToClassList("content");
            Add(_scrollView);

            Foldout transitionsFoldout = new Foldout()
            {
                value = true, text = "Transitions"
            };

            transitionsFoldout.RegisterValueChangedCallback(e => e.StopPropagation());
            _scrollView.Add(transitionsFoldout);

            _transitions            = new ResizableListView();
            _transitions.name       = "Transitions";
            _transitions.itemHeight = 20;
            _transitions.makeItem   = () =>
            {
                VisualElement container = new VisualElement();

                Label label = new Label()
                {
                    pickingMode = PickingMode.Ignore
                };
                Button removeButton = new Button()
                {
                    text = "X"
                };

                container.Add(label);
                container.Add(removeButton);

                return(container);
            };
            _transitions.bindItem = (item, index) =>
            {
                void Remove()
                {
                    _connection.RemoveTransition(index);
                }

                item.Q <Label>().text = $"{((IStateNode)_connection.Source).Name} >>> {((StateNodeUI)_connection.Destination).Name}";
                Button removeButton = item.Q <Button>();
                removeButton.clicked -= Remove;
                removeButton.clicked += Remove;
            };
            _transitions.onSelectionChange += selection =>
            {
                _selectedTransition = (TransitionInfo)selection.First();
                BindTransitionFields(_selectedTransition);
            };
            _transitions.selectionType = SelectionType.Single;
            _transitions.reorderable   = true;

            transitionsFoldout.Add(_transitions);

            DurationTypeField = new EnumField("Duration Type", DurationType.Fixed);
            DurationTypeField.RegisterValueChangedCallback(e =>
            {
                _selectedTransition.DurationType = (DurationType)e.newValue;
                DurationField.label = (DurationType)e.newValue == DurationType.Fixed ? "Duration (s)" : "Duration (%)";
            });
            _scrollView.Add(DurationTypeField);

            DurationField = new FloatField("Duration (s)");
            DurationField.RegisterValueChangedCallback(e => _selectedTransition.Duration = e.newValue);
            _scrollView.Add(DurationField);

            OffsetTypeField = new EnumField("Offset Type", DurationType.Fixed);
            OffsetTypeField.RegisterValueChangedCallback(e =>
            {
                _selectedTransition.OffsetType = (DurationType)e.newValue;
                OffsetField.label = (DurationType)e.newValue == DurationType.Fixed ? "Offset (s)" : "Offset (%)";
            });
            _scrollView.Add(OffsetTypeField);

            OffsetField = new FloatField("Offset (s)");
            OffsetField.RegisterValueChangedCallback(e => _selectedTransition.Offset = e.newValue);
            _scrollView.Add(OffsetField);

            InterruptionSourceField = new EnumField("Interruption Source", TransitionInterruptionSource.None);
            InterruptionSourceField.RegisterValueChangedCallback(e =>
            {
                TransitionInterruptionSource interruptionSource = (TransitionInterruptionSource)e.newValue;
                _selectedTransition.InterruptionSource          = interruptionSource;

                if (interruptionSource == TransitionInterruptionSource.None || interruptionSource == TransitionInterruptionSource.NextState)
                {
                    OrderedInterruptionToggle.style.display = DisplayStyle.None;
                }
                else
                {
                    OrderedInterruptionToggle.style.display = DisplayStyle.Flex;
                }
            });
            _scrollView.Add(InterruptionSourceField);

            OrderedInterruptionToggle = new Toggle("Ordered Interruption");
            OrderedInterruptionToggle.RegisterValueChangedCallback(e =>
            {
                _selectedTransition.OrderedInterruption = e.newValue;
                e.StopPropagation();
            });
            OrderedInterruptionToggle.style.display = DisplayStyle.None;
            _scrollView.Add(OrderedInterruptionToggle);

            InterruptableByAnyStateToggle = new Toggle("Interruptable By Any State");
            InterruptableByAnyStateToggle.RegisterValueChangedCallback(e =>
            {
                _selectedTransition.InterruptableByAnyState = e.newValue;
                e.StopPropagation();
            });
            _scrollView.Add(InterruptableByAnyStateToggle);

            PlayAfterTransitionToggle = new Toggle("Play After Transition");
            PlayAfterTransitionToggle.RegisterValueChangedCallback(e =>
            {
                _selectedTransition.PlayAfterTransition = e.newValue;
                e.StopPropagation();
            });
            _scrollView.Add(PlayAfterTransitionToggle);

            Foldout conditionsFoldout = new Foldout()
            {
                value = true, text = "Conditions"
            };

            conditionsFoldout.RegisterValueChangedCallback(e => e.StopPropagation());
            _scrollView.Add(conditionsFoldout);

            VisualElement conditionListButtons = new VisualElement();

            conditionListButtons.style.flexDirection = FlexDirection.Row;
            conditionsFoldout.Add(conditionListButtons);

            Button removeConditionButton = new Button(() =>
            {
                if (_conditions.selectedItem == null)
                {
                    return;
                }

                int firstIndex = _conditions.selectedIndex;
                int indexFixer = 0;

                foreach (var index in _conditions.selectedIndices)
                {
                    _selectedTransition.Conditions.RemoveAt(index - indexFixer);
                    indexFixer++;
                }

                _conditions.Refresh();
                _conditions.selectedIndex = Mathf.Min(firstIndex, _selectedTransition.Conditions.Count - 1);
            })
            {
                text = "Remove Condition"
            };

            conditionListButtons.Add(removeConditionButton);

            Button addConditionButton = new Button(() =>
            {
                _selectedTransition.Conditions.Add(new TransitionInfoCondition());
                _conditions.Refresh();
            })
            {
                text = "Add Condition"
            };

            conditionListButtons.Add(addConditionButton);

            _conditions            = new ResizableListView();
            _conditions.name       = "Conditions";
            _conditions.itemHeight = 25;
            _conditions.makeItem   = () =>
            {
                TransitionConditionUI transitionCondition = new TransitionConditionUI();

                return(transitionCondition);
            };
            _conditions.bindItem = (item, index) =>
            {
                ((TransitionConditionUI)item).Bind(_selectedTransition.Conditions[index]);
            };
            _conditions.selectionType = SelectionType.Multiple;
            _conditions.reorderable   = true;
            conditionsFoldout.Add(_conditions);

            RegisterCallback <ChangeEvent <bool> >(e => ToggleInClassList("expanded"));
        }