Пример #1
0
        public AnyState GenerateData(Dictionary <StateNodeUI, State> stateMap)
        {
            var anyState = new AnyState()
            {
                Name = Name
            };

            foreach (var filter in _filters)
            {
                anyState.StateFilters.Add(new AnyStateFilter {
                    State = filter.State == null ? null : stateMap[filter.State], Mode = filter.Mode
                });
            }

            foreach (var element in outputContainer.Children())
            {
                if (!(element is Port port))
                {
                    continue;
                }

                anyState.ExitTransitions.Add(null);
            }

            return(anyState);
        }
Пример #2
0
 private void Update()
 {
     if (isPaused || isDisabled)
     {
         return;
     }
     if (ActiveNode != null)
     {
         if (!ActiveNode.IsEntered)
         {
             ActiveNode.OnEnter();
         }
         else if (!ActiveNode.IsFinished)
         {
             ActiveNode.OnUpdate();
             UpdateChanges(ActiveNode);
         }
     }
     if (AnyState != null)
     {
         if (!AnyState.IsEntered)
         {
             AnyState.OnEnter();
         }
         else if (!AnyState.IsFinished)
         {
             AnyState.OnUpdate();
             UpdateChanges(AnyState);
         }
     }
 }
	public void SetAIController()
	{
		enabled = (originalController != null && originalController.states.Count > 0);
		if (enabled) {
			triggers= new List<BaseTrigger>();
			attributes= new List<BaseAttribute>();
			controller=(AIController)ScriptableObject.Instantiate(originalController);
			for(int i=0;i<controller.parameters.Count;i++)
			{
				controller.parameters[i]=(NamedParameter)ScriptableObject.Instantiate(controller.parameters[i]);
				controller.parameters[i].OnChangeParameter = OnChangeParameter;
			}
			for(int i=0;i< controller.states.Count;i++)
			{
				controller.states[i]=(State)ScriptableObject.Instantiate(controller.states[i]);
				controller.states[i].Initialize(this);
				if(controller.states[i] is BaseTrigger){
					triggers.Add(controller.states[i] as BaseTrigger);
				}
				if(controller.states[i] is OnAttributeChanged){
					attributes.Add((controller.states[i] as OnAttributeChanged).attribute);
				}
			}
			
			currentStateIndex= controller.states.FindIndex (state => state.isDefaultState == true);
			anyState = (AnyState)controller.states.Find (state => state.GetType() == typeof(AnyState));
		}
	}
        public static void CreateStateMachine()
        {
            FsmEditor.ShowWindow();
            StateMachine stateMachine = AssetCreator.CreateAsset <StateMachine> (true);

            if (stateMachine == null)
            {
                return;
            }
            stateMachine.color = (int)NodeColor.Blue;
            stateMachine.Name  = stateMachine.name;

            FsmGameObject gameObject = ScriptableObject.CreateInstance <FsmGameObject> ();

            gameObject.Name      = "Owner";
            gameObject.hideFlags = HideFlags.HideInHierarchy;
            gameObject.IsHidden  = true;
            gameObject.IsShared  = true;

            stateMachine.Variables = ArrayUtility.Add <FsmVariable> (stateMachine.Variables, gameObject);
            AssetDatabase.AddObjectToAsset(gameObject, stateMachine);
            AssetDatabase.SaveAssets();


            AnyState state = FsmEditorUtility.AddNode <AnyState> (FsmEditor.Center, stateMachine);

            state.color = (int)NodeColor.Aqua;
            state.Name  = "Any State";
            FsmEditor.SelectStateMachine(stateMachine);
        }
    private void Awake()
    {
        enabled = (originalController != null && originalController.states.Count > 0);
        if (enabled)
        {
            triggers   = new List <BaseTrigger>();
            attributes = new List <BaseAttribute>();
            controller = (AIController)ScriptableObject.Instantiate(originalController);
            for (int i = 0; i < controller.parameters.Count; i++)
            {
                controller.parameters[i] = (NamedParameter)ScriptableObject.Instantiate(controller.parameters[i]);
            }
            for (int i = 0; i < controller.states.Count; i++)
            {
                controller.states[i] = (State)ScriptableObject.Instantiate(controller.states[i]);
                controller.states[i].Initialize(this);
                if (controller.states[i] is BaseTrigger)
                {
                    triggers.Add(controller.states[i] as BaseTrigger);
                }
                if (controller.states[i] is OnAttributeChanged)
                {
                    attributes.Add((controller.states[i] as OnAttributeChanged).attribute);
                }
            }

            currentStateIndex = controller.states.FindIndex(state => state.isDefaultState == true);
            anyState          = (AnyState)controller.states.Find(state => state.GetType() == typeof(AnyState));
        }
    }
        static void CreateAIController()
        {
            AIController controller = CreateAssetAtSelectionPath <AIController> ();

            EntryState entryState = ScriptableObject.CreateInstance <EntryState> ();

            entryState.position = new Vector2(0, 0);
            entryState.name     = "Entry";

            AnyState anyState = ScriptableObject.CreateInstance <AnyState> ();

            anyState.position = new Vector2(0, 200);
            anyState.name     = "Any";

            controller.entryState = entryState;
            controller.anyState   = anyState;

            #if SERIALIZER_DEBUG
            Debug.Log("Controller [" + controller.name + "] created.");
            #endif

            AddNewNodeToController(controller, entryState, false);
            AddNewNodeToController(controller, anyState, false);

            Save();
        }
Пример #7
0
        public void LoadData(GraphView graphView, AnyState anyState, Dictionary <State, StateNodeUI> map)
        {
            anyState.StateFilters.ForEach(filter =>
            {
                _filters.Add(new AnyStateFilterItem {
                    State = filter.State == null ? null : map[filter.State], Mode = filter.Mode
                });
            });

            _filterList.List.Refresh();
        }
Пример #8
0
        private void SelectStateMachine()
        {
            GUIContent content = new GUIContent(FsmEditor.Active != null?FsmEditor.Active.Name:"[None Selected]");
            float      width   = EditorStyles.toolbarDropDown.CalcSize(content).x;

            width = Mathf.Clamp(width, 100f, width);
            if (GUILayout.Button(content, EditorStyles.toolbarDropDown, GUILayout.Width(width)))
            {
                GenericMenu toolsMenu = new GenericMenu();
                if (FsmEditor.ActiveGameObject != null)
                {
                    foreach (ICodeBehaviour behaviour in FsmEditor.ActiveGameObject.GetComponents <ICodeBehaviour>())
                    {
                        SelectStateMachineMenu(behaviour.stateMachine, ref toolsMenu);
                    }
                }
                else if (FsmEditor.Active != null)
                {
                    SelectStateMachineMenu(FsmEditor.Active.Root, ref toolsMenu);
                }
                toolsMenu.AddItem(new GUIContent("[Create New]"), false, delegate() {
                    StateMachine stateMachine = AssetCreator.CreateAsset <StateMachine> (true);
                    if (stateMachine != null)
                    {
                        stateMachine.Name        = stateMachine.name;
                        AnyState state           = FsmEditorUtility.AddNode <AnyState> (FsmEditor.Center, stateMachine);
                        state.color              = (int)NodeColor.Aqua;
                        state.Name               = "Any State";
                        FsmGameObject gameObject = ScriptableObject.CreateInstance <FsmGameObject> ();
                        gameObject.Name          = "Owner";
                        gameObject.hideFlags     = HideFlags.HideInHierarchy;
                        gameObject.IsHidden      = true;
                        gameObject.IsShared      = true;

                        stateMachine.Variables = ArrayUtility.Add <FsmVariable> (stateMachine.Variables, gameObject);
                        AssetDatabase.AddObjectToAsset(gameObject, stateMachine);
                        AssetDatabase.SaveAssets();

                        FsmEditor.SelectStateMachine(stateMachine);
                    }
                });
                toolsMenu.ShowAsContext();
            }
        }
Пример #9
0
        public void Execute()
        {
            var graph = stateMachine.GetStateMachineGraph();

            //Create the rect of the state (for the graph)
            var rect = new Rect(0, 0, 120, 60);

            rect.x = this.position.x - rect.width / 2;
            rect.y = this.position.y - rect.height / 2;

            var anyState = new AnyState()
            {
                Rect = rect,
                ID   = graph.GetUniqueAnyStateName()
            };

            Undo.RecordObject(this.stateMachine, "Added anyState");

            graph.TryAddNode(anyState);
        }
Пример #10
0
        private void SwitchNode(Node toNode)
        {
            if (toNode == null)
            {
                return;
            }

            if (ActiveNode != null)
            {
                ActiveNode.OnExit();
            }
            ActiveNode = toNode;
            if (this.ActiveNode != null && this.ActiveNode.Parent != this.AnyState.Parent)
            {
                this.AnyState.OnExit();
                this.AnyState = this.ActiveNode.Parent.GetAnyState();
                this.AnyState.OnEnter();
            }
            switchToNode = null;
            ActiveNode.OnEnter();
        }
Пример #11
0
 public void EnableStateMachine()
 {
     if (stateMachine == null)
     {
         enabled = false;
         return;
     }
     if (!stateMachine.IsInitialized)
     {
         stateMachine = (StateMachine)FsmUtility.Copy(stateMachine);
         stateMachine.Init(this);
     }
     if (!isPaused)
     {
         this.ActiveNode = stateMachine.GetStartNode();
         this.AnyState   = stateMachine.GetAnyState();
     }
     isPaused   = false;
     isDisabled = false;
     enabled    = true;
 }
        public static T AddNode <T>(Vector2 position, StateMachine parent)
        {
            if (parent == null)
            {
                Debug.LogWarning("Can't add node to parent state machine, because the parent state machine is null!");
                return(default(T));
            }
            Node node = (Node)ScriptableObject.CreateInstance(typeof(T));

            node.hideFlags = HideFlags.HideInHierarchy;

            node.Name    = FsmEditorUtility.GenerateUniqueNodeName <T> (parent.Root);
            node.Parent  = parent;
            parent.Nodes = ArrayUtility.Add <Node> (parent.Nodes, node);

            node.position = new Rect(position.x, position.y, FsmEditorStyles.StateWidth, FsmEditorStyles.StateHeight);
            UpdateNodeColor(node);

            if (EditorUtility.IsPersistent(parent))
            {
                AssetDatabase.AddObjectToAsset(node, parent);
            }

            if (node.GetType() == typeof(StateMachine))
            {
                node.position.width  = FsmEditorStyles.StateMachineWidth;
                node.position.height = FsmEditorStyles.StateMachineHeight;

                AnyState state = FsmEditorUtility.AddNode <AnyState> (FsmEditor.Center, (StateMachine)node);
                UpdateNodeColor(state);
                state.Name = "Any State";
            }

            AssetDatabase.SaveAssets();
            return((T)(object)node);
        }
        public static void Paste(Vector2 position, StateMachine stateMachine)
        {
            List <Node> copiedNodes = new List <Node> ();
            Vector2     center      = GetCenter(nodes);

            for (int i = 0; i < nodes.Count; i++)
            {
                Node origNode = nodes[i];
                List <FsmVariable> sharedVariables = new List <FsmVariable>();
                GetSharedVariables(origNode, ref sharedVariables);
                if (sharedVariables.Count > 0)
                {
                    string variableNames = string.Empty;
                    sharedVariables.Select(x => x.Name).ToList().ForEach(y => variableNames = (variableNames + (string.IsNullOrEmpty(variableNames)?"":",") + y));
                    if (EditorUtility.DisplayDialog("Paste Variables", "Copied states have reference to shared variables, do you want to paste those variables? (" + variableNames + ")", "Yes", "No"))
                    {
                        for (int j = 0; j < sharedVariables.Count; j++)
                        {
                            FsmVariable variable = sharedVariables[j];
                            stateMachine.SetVariable(variable.Name, variable.GetValue());
                        }
                    }
                }

                Node mNode = (Node)FsmUtility.Copy(origNode);
                mNode.Parent    = stateMachine;
                mNode.hideFlags = HideFlags.HideInHierarchy;
                if (mNode.IsStartNode && stateMachine.GetStartNode() != null)
                {
                    mNode.IsStartNode = false;
                }
                //mNode.Name = FsmEditorUtility.GenerateUniqueNodeName(mNode.GetType(),stateMachine);
                stateMachine.Nodes = ArrayUtility.Add <Node> (stateMachine.Nodes, mNode);

                mNode.position = new Rect(-(center.x - origNode.position.x) + position.x, -(center.y - origNode.position.y) + position.y, FsmEditorStyles.StateWidth, FsmEditorStyles.StateHeight);

                if (mNode.GetType() == typeof(StateMachine))
                {
                    mNode.position.width  = FsmEditorStyles.StateMachineWidth;
                    mNode.position.height = FsmEditorStyles.StateMachineHeight;
                }
                FsmEditorUtility.UpdateNodeColor(mNode);
                copiedNodes.Add(mNode);
            }

            for (int i = 0; i < copiedNodes.Count; i++)
            {
                Node mNode = copiedNodes [i];
                if (mNode is AnyState)
                {
                    bool     mOverride = EditorUtility.DisplayDialog("Override AnyState", "AnyState can only exist once per state machine. Do you want to override it?", "Yes", "No");
                    AnyState anyState  = stateMachine.Nodes.ToList().Find(x => x.GetType() == typeof(AnyState) && (mOverride && x != mNode || !mOverride && x == mNode)) as AnyState;
                    stateMachine.Nodes = ArrayUtility.Remove(stateMachine.Nodes, anyState);
                    FsmEditorUtility.DestroyImmediate(anyState);
                    FsmEditor.SelectedNodes.Clear();
                }
            }

            for (int i = 0; i < copiedNodes.Count; i++)
            {
                Node mNode = copiedNodes[i];

                foreach (Transition transition in mNode.Transitions)
                {
                    Node toNode = copiedNodes.Find(x => x.Name == transition.ToNode.Name) ?? stateMachine.Nodes.ToList().Find(x => x.Name == transition.ToNode.Name);
                    if (toNode != null)
                    {
                        transition.ToNode = toNode;
                    }
                    else
                    {
                        FsmEditorUtility.DestroyImmediate(transition);
                        mNode.Transitions = ArrayUtility.Remove(mNode.Transitions, transition);
                    }
                }
            }

            for (int i = 0; i < copiedNodes.Count; i++)
            {
                Node mNode = stateMachine.Nodes.ToList().Find(x => x.Name == copiedNodes[i].Name && x != copiedNodes[i]);
                if (mNode != null)
                {
                    copiedNodes[i].Name = FsmEditorUtility.GenerateUniqueNodeName(copiedNodes[i].GetType(), stateMachine);
                }
            }

            FsmEditorUtility.ParentChilds(stateMachine);
            nodes.Clear();
            EditorUtility.SetDirty(stateMachine);
            ErrorChecker.CheckForErrors();
        }
        public void LoadStateMachine(StateMachineNodeUI stateMachineUI)
        {
            CreateGraphView();

            void SetNodePositionAndExpansion(Node node, NodeVisualInfo info)
            {
                node.SetPosition(new Rect(info.Position, Vector2.zero));
                node.expanded = info.IsExpanded;
            }

            NodeUI = stateMachineUI;

            var stateMachine = (StateMachineNode)stateMachineUI.StateMachineNodeAsset.Data;

            var parameterMap     = new Dictionary <Parameter, ParameterNodeUI>();
            var valueProviderMap = new Dictionary <IValueProvider, StateMachineBaseNodeUI>();

            foreach (var parameter in stateMachine.Parameters.Values)
            {
                var parameterNode = new ParameterNodeUI();
                GraphView.AddNode(parameterNode);
                SetNodePositionAndExpansion(parameterNode, stateMachineUI.StateMachineNodeAsset.ParameterMap[parameter.Id]);
                parameterNode.LoadData(parameter);
                parameterMap.Add(parameter, parameterNode);
                valueProviderMap.Add(parameter.ValueProvider, parameterNode);
            }

            var stateToNodeMap = new Dictionary <State, StateNodeUI>();
            var nodeToStateMap = new Dictionary <StateNodeUI, State>();

            for (int i = 0; i < stateMachine.States.Count; i++)
            {
                string stateName = stateMachine.States.KeyAt(i);
                State  state     = stateMachine.States.At(i);

                var stateNode = new StateNodeUI();
                stateNode.Name = stateName;
                GraphView.AddNode(stateNode);
                SetNodePositionAndExpansion(stateNode, stateMachineUI.StateMachineNodeAsset.StateMap[state.Id]);
                stateToNodeMap.Add(state, stateNode);
                nodeToStateMap.Add(stateNode, state);
                valueProviderMap.Add(state.Time, stateNode);
                valueProviderMap.Add(state.PreviousTime, stateNode);
                valueProviderMap.Add(state.NormalizedTime, stateNode);
                valueProviderMap.Add(state.PreviousNormalizedTime, stateNode);
            }

            var anyStateMap = new Dictionary <AnyState, AnyStateNodeUI>();

            for (int i = 0; i < stateMachine.AnyStates.Items.Count; i++)
            {
                string   anyStateName = stateMachine.AnyStates.Items.KeyAt(i);
                AnyState anyState     = stateMachine.AnyStates.Items.At(i);

                //if (anyState == null) { continue; }

                var anyStateNode = new AnyStateNodeUI();
                anyStateNode.Name = anyStateName;
                GraphView.AddNode(anyStateNode);
                SetNodePositionAndExpansion(anyStateNode, stateMachineUI.StateMachineNodeAsset.AnyStateMap[anyState.Id]);
                anyStateNode.LoadData(GraphView, anyState, stateToNodeMap);
                anyStateMap.Add(anyState, anyStateNode);

                foreach (var transition in anyState.ExitTransitions)
                {
                    var transitionConnection = (TransitionConnectionUI)CreateConnection(anyStateNode, stateToNodeMap[transition.DestinationState], false);
                    LoadTransitionInfo(transitionConnection.Transitions[transitionConnection.Transitions.Count - 1], transition);
                }
            }

            if (NodeUI.StateMachineNodeAsset.AnyStatePriorityManager != null)
            {
                var anyStatePriorityManagerNode = new AnyStatePriorityManagerNodeUI();
                GraphView.AddNode(anyStatePriorityManagerNode);
                SetNodePositionAndExpansion(anyStatePriorityManagerNode, stateMachineUI.StateMachineNodeAsset.AnyStatePriorityManager);
                anyStatePriorityManagerNode.LoadData(GraphView, stateMachine.AnyStates.Items.Values, anyStateMap);
            }

            foreach (var state in stateMachine.States.Values)
            {
                foreach (var transition in state.ExitTransitions)
                {
                    StateNodeUI stateNode            = stateToNodeMap[(State)transition.SourceState];
                    var         transitionConnection = (TransitionConnectionUI)CreateConnection(stateNode, stateToNodeMap[transition.DestinationState], false);
                    LoadTransitionInfo(transitionConnection.Transitions[transitionConnection.Transitions.Count - 1], transition);
                }
            }

            void LoadTransitionInfo(TransitionInfo transitionInfo, Transition transition)
            {
                transitionInfo.DurationType            = transition.DurationType;
                transitionInfo.Duration                = transition.Duration;
                transitionInfo.OffsetType              = transition.OffsetType;
                transitionInfo.Offset                  = transition.Offset;
                transitionInfo.InterruptionSource      = transition.InterruptionSource;
                transitionInfo.OrderedInterruption     = transition.OrderedInterruption;
                transitionInfo.InterruptableByAnyState = transition.InterruptableByAnyState;
                transitionInfo.PlayAfterTransition     = transition.PlayAfterTransition;

                transition.Conditions.ForEach(condition =>
                {
                    TransitionInfoCondition infoCondition = new TransitionInfoCondition();
                    transitionInfo.Conditions.Add(infoCondition);

                    if (condition.ValueProvider == null)
                    {
                        return;
                    }

                    StateMachineBaseNodeUI node = valueProviderMap[condition.ValueProvider];

                    if (node is StateNodeUI stateNode)
                    {
                        State state = nodeToStateMap[stateNode];
                        infoCondition.ProviderSourceType = ValueProviderSourceType.State;
                        infoCondition.State = stateNode;
                        infoCondition.StateValueProvider = condition.ValueProvider == state.PreviousTime ? StateValueProviders.PreviousTime
                                                         : condition.ValueProvider == state.Time ? StateValueProviders.Time
                                                         : condition.ValueProvider == state.NormalizedTime ? StateValueProviders.NormalizedTime
                                                         : StateValueProviders.PreviousNormalizedTime;
                        FloatConditionEvaluator floatEvaluator = (FloatConditionEvaluator)condition.Evaluator;
                        infoCondition.FloatComparison          = floatEvaluator.Comparison;
                        infoCondition.FloatComparisonValue     = floatEvaluator.ComparisonValue;
                    }
                    else
                    {
                        ParameterNodeUI parameterNode    = (ParameterNodeUI)node;
                        infoCondition.ProviderSourceType = ValueProviderSourceType.Parameter;
                        infoCondition.Parameter          = parameterNode;

                        switch (condition.Evaluator)
                        {
                        case BoolConditionEvaluator boolEvaluator:
                            infoCondition.BoolComparisonValue = boolEvaluator.ComparisonValue == Bool.True;
                            break;

                        case IntConditionEvaluator intEvaluator:
                            infoCondition.IntComparison      = intEvaluator.Comparison;
                            infoCondition.IntComparisonValue = intEvaluator.ComparisonValue;
                            break;

                        case FloatConditionEvaluator floatEvaluator:
                            infoCondition.FloatComparison      = floatEvaluator.Comparison;
                            infoCondition.FloatComparisonValue = floatEvaluator.ComparisonValue;
                            break;
                        }
                    }
                });
            }

            EntryNodeUI entryStateNode = new EntryNodeUI();

            GraphView.AddNode(entryStateNode);
            GraphView.EntryNode = entryStateNode;
            if (NodeUI.StateMachineNodeAsset.EntryState != null)
            {
                SetNodePositionAndExpansion(entryStateNode, NodeUI.StateMachineNodeAsset.EntryState);
            }
            entryStateNode.LoadData(GraphView, stateMachine.EntryState, stateToNodeMap);
        }
        private void SaveStateMachine()
        {
            var stateMachine = new StateMachineNode();

            NodeUI.StateMachineNodeAsset = new StateMachineNodeAsset {
                Data = stateMachine
            };

            var parameterMap  = new Dictionary <ParameterNodeUI, Parameter>();
            var stateMap      = new Dictionary <StateNodeUI, State>();
            var anyStateMap   = new Dictionary <AnyStateNodeUI, AnyState>();
            var transitionMap = new Dictionary <TransitionInfo, Transition>();

            Parameters.Items.Values.ForEach(p =>
            {
                var parameter  = stateMachine.AddParameter(p.Name);
                parameter.Type = (ValueProviderType)p.ParameterTypeField.value;
                NodeUI.StateMachineNodeAsset.ParameterMap.Add(parameter.Id, new NodeVisualInfo(p.GetPosition().position, p.expanded));

                switch (parameter.ValueProvider)
                {
                case BoolProvider boolProvider:
                    boolProvider.Value = p.BoolField.value;
                    break;

                case IntProvider intProvider:
                    intProvider.Value = p.IntField.value;
                    break;

                case FloatProvider floatProvider:
                    floatProvider.Value = p.FloatField.value;
                    break;

                default:
                    break;
                }

                parameterMap.Add(p, parameter);
            });

            TransitionConnections.ForEach(transitionConnection =>
            {
                transitionConnection.Transitions.ForEach(transitionInfo =>
                {
                    Transition transition = new Transition()
                    {
                        DurationType            = transitionInfo.DurationType,
                        Duration                = transitionInfo.Duration,
                        OffsetType              = transitionInfo.OffsetType,
                        Offset                  = transitionInfo.Offset,
                        InterruptionSource      = transitionInfo.InterruptionSource,
                        OrderedInterruption     = transitionInfo.OrderedInterruption,
                        InterruptableByAnyState = transitionInfo.InterruptableByAnyState,
                        PlayAfterTransition     = transitionInfo.PlayAfterTransition
                    };

                    stateMachine.Transitions.Add(transition);
                    transitionMap.Add(transitionInfo, transition);
                });
            });

            States.Items.Values.ForEach(stateNode =>
            {
                var state = stateMachine.AddState(stateNode.Name);

                stateNode.ExitConnections.ForEach(connection =>
                {
                    ((TransitionConnectionUI)connection).Transitions.ForEach(transitionInfo =>
                    {
                        Transition transition  = transitionMap[transitionInfo];
                        transition.SourceState = state;
                        state.ExitTransitions.Add(transition);
                    });
                });

                stateNode.EntryConnections.ForEach(connection =>
                {
                    if (!(connection is TransitionConnectionUI transitionConnection))
                    {
                        return;
                    }

                    transitionConnection.Transitions.ForEach(transitionInfo =>
                    {
                        Transition transition       = transitionMap[transitionInfo];
                        transition.DestinationState = state;
                        state.EntryTransitions.Add(transition);
                    });
                });

                NodeUI.StateMachineNodeAsset.StateMap.Add(state.Id, new NodeVisualInfo(stateNode.GetPosition().position, stateNode.expanded));
                stateMap.Add(stateNode, state);
            });

            HashSet <AnyStateNodeUI> alreadyAddedAnyStates = new HashSet <AnyStateNodeUI>();

            if (GraphView.AnyStatePriorityManager == null)
            {
                NodeUI.StateMachineNodeAsset.AnyStatePriorityManager = null;
            }
            else
            {
                NodeUI.StateMachineNodeAsset.AnyStatePriorityManager = new NodeVisualInfo(GraphView.AnyStatePriorityManager.GetPosition().position, GraphView.AnyStatePriorityManager.expanded);

                foreach (var anyStateNode in GraphView.AnyStatePriorityManager.AnyStates)
                {
                    if (anyStateNode == null)
                    {
                        continue;
                    }

                    AnyState anyState = anyStateNode.GenerateData(stateMap);

                    anyStateNode.ExitConnections.ForEach(connection =>
                    {
                        ((TransitionConnectionUI)connection).Transitions.ForEach(transitionInfo =>
                        {
                            Transition transition  = transitionMap[transitionInfo];
                            transition.SourceState = anyState;
                            anyState.ExitTransitions.Add(transition);
                        });
                    });

                    stateMachine.AnyStates.AddItem(anyState);
                    NodeUI.StateMachineNodeAsset.AnyStateMap.Add(anyState.Id, new NodeVisualInfo(anyStateNode.GetPosition().position, anyStateNode.expanded));
                    alreadyAddedAnyStates.Add(anyStateNode);
                    anyStateMap.Add(anyStateNode, anyState);
                }
            }

            AnyStates.Items.Values.ForEach(anyStateNode =>
            {
                if (alreadyAddedAnyStates.Contains(anyStateNode))
                {
                    return;
                }

                AnyState anyState = anyStateNode.GenerateData(stateMap);

                anyStateNode.ExitConnections.ForEach(connection =>
                {
                    ((TransitionConnectionUI)connection).Transitions.ForEach(transitionInfo =>
                    {
                        Transition transition  = transitionMap[transitionInfo];
                        transition.SourceState = anyState;
                        anyState.ExitTransitions.Add(transition);
                    });
                });

                stateMachine.AnyStates.AddItem(anyState);
                NodeUI.StateMachineNodeAsset.AnyStateMap.Add(anyState.Id, new NodeVisualInfo(anyStateNode.GetPosition().position, anyStateNode.expanded));
                anyStateMap.Add(anyStateNode, anyState);
            });

            TransitionConnections.ForEach(transitionConnection =>
            {
                transitionConnection.Transitions.ForEach(transitionInfo =>
                {
                    Transition transition          = transitionMap[transitionInfo];
                    transition.Conditions.Capacity = transitionInfo.Conditions.Count;

                    transitionInfo.Conditions.ForEach(infoCondition =>
                    {
                        TransitionCondition condition = new TransitionCondition();

                        if (infoCondition.ProviderSourceType == ValueProviderSourceType.State)
                        {
                            if (infoCondition.State != null)
                            {
                                State state = stateMap[infoCondition.State];

                                switch (infoCondition.StateValueProvider)
                                {
                                case StateValueProviders.PreviousTime:
                                    condition.SetValueProvider(state.PreviousTime);
                                    break;

                                case StateValueProviders.Time:
                                    condition.SetValueProvider(state.Time);
                                    break;

                                case StateValueProviders.PreviousNormalizedTime:
                                    condition.SetValueProvider(state.PreviousNormalizedTime);
                                    break;

                                case StateValueProviders.NormalizedTime:
                                    condition.SetValueProvider(state.NormalizedTime);
                                    break;
                                }

                                FloatConditionEvaluator floatEvaluator = (FloatConditionEvaluator)condition.Evaluator;
                                floatEvaluator.Comparison      = infoCondition.FloatComparison;
                                floatEvaluator.ComparisonValue = infoCondition.FloatComparisonValue;
                            }
                        }
                        else if (infoCondition.Parameter != null)
                        {
                            condition.SetValueProvider(parameterMap[infoCondition.Parameter].ValueProvider);

                            switch (condition.Evaluator)
                            {
                            case BoolConditionEvaluator boolEvaluator:
                                boolEvaluator.ComparisonValue = infoCondition.BoolComparisonValue ? Bool.True : Bool.False;
                                break;

                            case IntConditionEvaluator intEvaluator:
                                intEvaluator.Comparison      = infoCondition.IntComparison;
                                intEvaluator.ComparisonValue = infoCondition.IntComparisonValue;
                                break;

                            case FloatConditionEvaluator floatEvaluator:
                                floatEvaluator.Comparison      = infoCondition.FloatComparison;
                                floatEvaluator.ComparisonValue = infoCondition.FloatComparisonValue;
                                break;

                            default:
                                break;
                            }
                        }

                        transition.Conditions.Add(condition);
                    });
                });
            });

            GraphView.EntryNode.GenerateData(stateMachine, stateMap);
            NodeUI.StateMachineNodeAsset.EntryState = new NodeVisualInfo(GraphView.EntryNode.GetPosition().position, GraphView.EntryNode.expanded);

            NodeUI.UpdateStatePorts();
        }
Пример #16
0
        public AnyStateContextMenu(Context context, AnyState anyState)
        {
            this.context = context;

            this.anyState = anyState;
        }