Пример #1
0
 public void SetTrueState(vFSMState node)
 {
     if (node.canTranstTo)
     {
         trueState = node;
     }
 }
Пример #2
0
 public void SetFalseState(vFSMState node)
 {
     if (node.canTranstTo)
     {
         falseState = node;
     }
 }
Пример #3
0
 public void SelectState(vFSMState state)
 {
     if (onSelectState != null)
     {
         onSelectState.Invoke(state);
     }
 }
Пример #4
0
 public void ConnectToState(vFSMState state)
 {
     if (wantConnection)
     {
         transitionPreview.onValidate.Invoke(state);
     }
     wantConnection = false;
 }
Пример #5
0
        public vFSMState TransitTo(vIFSMBehaviourController fsmBehaviour)
        {
            var       val        = true;
            vFSMState returState = null;

            for (int i = 0; i < decisions.Count; i++)
            {
                bool value = decisions[i].Validate(fsmBehaviour);

                if (!value)
                {
                    val = false;
                }
            }
            if (val && trueState)
            {
                returState = useTruState && !muteTrue ? trueState : null;
            }
            else if (!val && falseState)
            {
                returState = useFalseState && !muteFalse ? falseState : null;
            }

            if (transitionTimers == null)
            {
                transitionTimers = new Dictionary <vIFSMBehaviourController, float>();
            }
            if (!transitionTimers.ContainsKey(fsmBehaviour))
            {
                transitionTimers.Add(fsmBehaviour, 0f);
            }

            if (transitionTimers[fsmBehaviour] < transitionDelay && returState)
            {
                transitionTimers[fsmBehaviour] += Time.deltaTime;
                if (fsmBehaviour.debugMode)
                {
                    fsmBehaviour.SendDebug("<color=green>" + parentState.name + " Delay " + (transitionDelay - transitionTimers[fsmBehaviour]).ToString("00") + " To Enter in " + returState.Name + "</color>", parentState);
                }
                return(null);
            }
            else
            {
                transitionTimers[fsmBehaviour] = 0;
                if (fsmBehaviour.debugMode && returState)
                {
                    fsmBehaviour.SendDebug("<color=yellow>" + parentState.name + " Transited to " + returState.name + "</color>", parentState);
                }
            }
            return(returState);
        }
Пример #6
0
        public vFSMState TransitTo(vIFSMBehaviourController fsmBehaviour)
        {
            vFSMState node = defaultTransition;

            for (int i = 0; i < transitions.Count; i++)
            {
                node = transitions[i].TransitTo(fsmBehaviour);
                if (node)
                {
                    break;
                }
            }
            return(node);
        }
Пример #7
0
        public static void DeleteNode(int id, vFSMBehaviour curGraph)
        {
            if (curGraph)
            {
                if (id >= 0 && id < curGraph.states.Count)
                {
                    vFSMState deleteNode = curGraph.states[id];
                    if (deleteNode)
                    {
                        curGraph.selectedNode = null;
                        curGraph.overNode     = false;
                        curGraph.states.RemoveAt(id);

                        for (int i = 0; i < deleteNode.actions.Count; i++)
                        {
                            if (deleteNode.actions[i])
                            {
                                var o = new SerializedObject(deleteNode.actions[i]);
                                o.ApplyModifiedProperties();
                            }
                        }
                        for (int i = 0; i < deleteNode.transitions.Count; i++)
                        {
                            if (deleteNode.transitions[i].decisions != null)
                            {
                                for (int a = 0; a < deleteNode.transitions[i].decisions.Count; a++)
                                {
                                    if (deleteNode.transitions[i].decisions[i].decision)
                                    {
                                        var o = new SerializedObject(deleteNode.transitions[i].decisions[i].decision);
                                        o.ApplyModifiedProperties();
                                    }
                                }
                            }
                        }
                        if (curGraph.states.Count > 2 && curGraph.states[0].defaultTransition == deleteNode)
                        {
                            curGraph.states[0].defaultTransition = curGraph.states[2] as vFSMState;
                        }

                        Undo.DestroyObjectImmediate(deleteNode);
                        AssetDatabase.SaveAssets();
                        AssetDatabase.Refresh();
                    }
                }
            }
        }
Пример #8
0
 public virtual void ChangeState(vFSMState state)
 {
     if (state && state != currentState && !inChangeState)
     {
         inChangeState = true;
         _lastState    = currentState;
         currentState  = null;
         if (_lastState)
         {
             if (debugMode)
             {
                 SendDebug("<color=red>EXIT:" + _lastState.name + "</color>" + "  " + "<color=yellow> ENTER :" + state.Name + " </color> ", gameObject);
             }
             _lastState.OnStateExit(this);
         }
         currentState = state;
         state.OnStateEnter(this);
         inChangeState = false;
     }
 }
Пример #9
0
        void OnSelectState(vFSMState state)
        {
            Event e = Event.current;

            if (!e.shift && !inDrawRect)
            {
                state.parentGraph.DeselectAll();
            }
            if (!state.isSelected)
            {
                state.isSelected = true;
            }
            if (Selection.activeObject != state)
            {
                Selection.activeObject = state;
            }
            if (!selectedStates.Contains(state))
            {
                selectedStates.Add(state);
            }
        }
Пример #10
0
        public static void CreateNode(vFSMBehaviour curGraph, Vector2 mousePos)
        {
            if (curGraph != null)
            {
                vFSMState curState = null;
                Undo.RecordObject(curGraph, "New Node");
                curState = ScriptableObject.CreateInstance <vFSMState>();

                curState.Name = "State " + (curGraph.states.Count > 1 ? (curGraph.states.Count - 2).ToString() : "");

                if (curGraph.states.Count > 0)
                {
                    if (curGraph.states[0].defaultTransition == null)
                    {
                        curGraph.states[0].defaultTransition = curState;
                    }
                }
                curState.nodeColor = Color.white;
                if (curState != null)
                {
                    curState.InitNode();
                    curState.nodeRect.x  = mousePos.x;
                    curState.nodeRect.y  = mousePos.y;
                    curState.parentGraph = curGraph;
                    curState.hideFlags   = HideFlags.HideInHierarchy;

                    curGraph.states.Add(curState);

                    AssetDatabase.AddObjectToAsset(curState, curGraph);
                    var count = curState.GetSameComponentNameCount <vFSMState>();
                    if (count > 0)
                    {
                        curState.Name += " " + (count - 1).ToString();
                    }

                    AssetDatabase.SaveAssets();
                    AssetDatabase.Refresh();
                }
            }
        }
        void DrawState(vIFSMBehaviourController target, vFSMState state, GUIStyle style, Color color, GUISkin skin, string label = "")
        {
            if (state)
            {
                GUILayout.BeginVertical(style, GUILayout.MaxWidth(200));
                {
                    if (!string.IsNullOrEmpty(label))
                    {
                        GUILayout.Box(label, style, GUILayout.Height(30));
                    }
                    GUILayout.Box(state.name, style, GUILayout.Height(30));
                    GUI.color = color;
                    GUILayout.BeginVertical(skin.box);
                    {
                        GUILayout.BeginHorizontal(GUILayout.MaxWidth(200));
                        {
                            GUILayout.Space(5);
                            GUILayout.BeginVertical(GUILayout.Width(200));
                            {
                                var fontTransitionStyle = new GUIStyle(EditorStyles.whiteMiniLabel);
                                fontTransitionStyle.alignment    = TextAnchor.MiddleCenter;
                                fontTransitionStyle.stretchWidth = true;
                                //  fontTransitionStyle.wordWrap = true;
                                if (state.transitions.Count > 0)
                                {
                                    GUILayout.Label("Transitions", fontTransitionStyle);
                                    for (int i = 0; i < state.transitions.Count; i++)
                                    {
                                        var transition = state.transitions[i];

                                        GUILayout.BeginVertical(skin.GetStyle("BoxLarge"));
                                        {
                                            if (transition.useTruState)
                                            {
                                                GUILayout.Label((transition.transitionType == vTransitionOutputType.TrueFalse? "Output True:":"Output Default") + " >>>  " + (transition.trueState && !transition.muteTrue ? transition.trueState.name : "None"), fontTransitionStyle);
                                            }
                                            if (transition.useFalseState && transition.transitionType == vTransitionOutputType.TrueFalse)
                                            {
                                                GUILayout.Label((transition.transitionType == vTransitionOutputType.TrueFalse ? "Output False:" : "Output Default") + " >>>  " + (transition.falseState && !transition.muteFalse ? transition.falseState.name : "None"), fontTransitionStyle);
                                            }
                                            GUILayout.BeginHorizontal();
                                            {
                                                if (transition.decisions.Count > 0)
                                                {
                                                    GUILayout.Space(5);
                                                    GUILayout.BeginVertical();
                                                    for (int a = 0; a < transition.decisions.Count; a++)
                                                    {
                                                        //  fontTransitionStyle.fontSize = 10;
                                                        GUILayout.BeginHorizontal(skin.box, GUILayout.Height(20));
                                                        {
                                                            var decision = transition.decisions[a];
                                                            if (decision.decision)
                                                            {
                                                                var valid = false;
                                                                if (decision.validationByController != null && decision.validationByController.ContainsKey(target))
                                                                {
                                                                    valid = decision.validationByController[target];
                                                                }

                                                                validationStyle = new GUIStyle(skin.box);
                                                                GUILayout.Label(decision.decision.Name + " = " + decision.trueValue, fontTransitionStyle, GUILayout.Height(15));
                                                                //vcolor = valid ? Color.green : Color.red;
                                                                validationStyle.fontSize         = 12;
                                                                validationStyle.fontStyle        = FontStyle.Bold;
                                                                validationStyle.normal.textColor = valid ? Color.green : Color.red;
                                                                GUILayout.FlexibleSpace();
                                                                GUILayout.Box(valid ? "YES" : "NO", validationStyle, GUILayout.Width(30), GUILayout.ExpandHeight(true));
                                                                GUI.color = color;
                                                            }
                                                        }
                                                        GUILayout.EndHorizontal();
                                                    }
                                                    GUILayout.EndVertical();
                                                    GUILayout.Space(5);
                                                }
                                            }
                                            GUILayout.EndHorizontal();
                                            GUILayout.Space(5);
                                        }
                                        GUILayout.EndVertical();
                                    }
                                }
                                else if (state.defaultTransition)
                                {
                                    GUILayout.Label("Output Direct >>> " + state.defaultTransition.name, fontTransitionStyle);
                                }
                                else
                                {
                                    GUILayout.Label("Without Transition", fontTransitionStyle);
                                }
                            }
                            GUILayout.EndVertical();
                            GUILayout.Space(5);
                        }
                        GUILayout.EndHorizontal();
                    }
                    GUILayout.EndVertical();
                }
                GUILayout.EndVertical();
                GUILayout.Space(5);
            }
        }