Beispiel #1
0
		private void AddTransition(Node fromNode,Node toNode){
			if (fromNode == null || toNode == null || toNode.GetType () == typeof(AnyState)) {
				return;
			}
			Transition transition= ScriptableObject.CreateInstance<Transition>();
			transition.hideFlags = HideFlags.HideInHierarchy;
			transition.Init(toNode,fromNode);
			if(EditorUtility.IsPersistent(fromNode)){
				AssetDatabase.AddObjectToAsset(transition,fromNode);
				AssetDatabase.SaveAssets();
			}
			fromNode.Transitions=ArrayUtility.Add<Transition>(fromNode.Transitions,transition);
			NodeInspector.Dirty ();	
		}
Beispiel #2
0
        protected virtual void OnPreviewGUI(ExecutableNode node)
        {
            GUIStyle style = new GUIStyle("IN BigTitle");

            style.padding.top = 0;
            GUILayout.BeginVertical(style);
            GUILayout.BeginHorizontal();
            GUILayout.Label(node.name, EditorStyles.boldLabel);
            GUILayout.FlexibleSpace();
            GUIStyle labelStyle = new GUIStyle("label");

            labelStyle.contentOffset = new Vector2(0, 5);
            if (!string.IsNullOrEmpty(node.GetHelpUrl()) && GUILayout.Button(FsmEditorStyles.helpIcon, labelStyle, GUILayout.Width(20)))
            {
                Application.OpenURL(node.GetHelpUrl());
            }
            GUILayout.EndHorizontal();
            GUILayout.Space(3f);
            GUILayout.Label(node.GetTooltip(), FsmEditorStyles.wrappedLabel);
            GUILayout.BeginHorizontal();
            GUILayout.FlexibleSpace();

            Node selectedNode = FsmEditor.SelectionCount > 0? FsmEditor.SelectedNodes [0]:null;

            if (GUILayout.Button(selectedNode != null? "Add to state" : "Select one state to add") && selectedNode != null)
            {
                OnAddNode(selectedNode, node.GetType());
                NodeInspector.Dirty();
            }

            GUILayout.EndHorizontal();
            GUILayout.EndVertical();

            if (PreferencesEditor.GetBool(Preference.ActionBrowserShowPreview, true))
            {
                EditorGUI.BeginDisabledGroup(true);
                GUIDrawer.OnGUI(node);
                EditorGUI.EndDisabledGroup();
                GUILayout.Space(5);
            }
        }
        private void ResetConditionList()
        {
            if (transition == null)
            {
                return;
            }
            this.conditions    = this.transition.Conditions;
            this.conditionList = new ReorderableList(this.conditions, "Condition", true, true)
            {
                drawElementCallback = new ReorderableList.ElementCallbackDelegate(this.OnConditionElement),
                onReorderCallback   = new ReorderableList.ReorderCallbackDelegate(this.OnReorderConditionList),
                onAddCallback       = new ReorderableList.AddCallbackDelegate(delegate(){
                    FsmGUIUtility.SubclassMenu <Condition> (CreateCondition);
                }),
                onContextClick = new ReorderableList.ContextCallbackDelegate(delegate(int index){
                    FsmGUIUtility.ExecutableContextMenu(conditions[index], node).ShowAsContext();
                }),
                onHeaderClick = new ReorderableList.OnHeaderClick(delegate(){
                    GenericMenu menu = new GenericMenu();

                    if (conditions.Length > 0)
                    {
                        menu.AddItem(new GUIContent("Copy"), false, delegate {
                            copy = transition;
                        });
                    }
                    else
                    {
                        menu.AddDisabledItem(new GUIContent("Copy"));
                    }
                    if (copy != null && copy.Conditions.Length > 0)
                    {
                        menu.AddItem(new GUIContent("Paste After"), false, delegate() {
                            for (int i = 0; i < copy.Conditions.Length; i++)
                            {
                                ExecutableNode dest   = FsmUtility.Copy(copy.Conditions[i]);
                                transition.Conditions = ArrayUtility.Add <Condition>(transition.Conditions, (Condition)dest);
                                FsmEditorUtility.ParentChilds(transition);
                                NodeInspector.Dirty();
                            }
                        });
                        menu.AddItem(new GUIContent("Paste Before"), false, delegate() {
                            for (int i = 0; i < copy.Conditions.Length; i++)
                            {
                                ExecutableNode dest   = FsmUtility.Copy(copy.Conditions[i]);
                                transition.Conditions = ArrayUtility.Insert <Condition>(transition.Conditions, (Condition)dest, 0);
                                FsmEditorUtility.ParentChilds(transition);
                                NodeInspector.Dirty();
                            }
                        });
                        if (copy != transition)
                        {
                            menu.AddItem(new GUIContent("Replace"), false, delegate() {
                                for (int i = 0; i < transition.Conditions.Length; i++)
                                {
                                    FsmEditorUtility.DestroyImmediate(transition.Conditions[i]);
                                }
                                transition.Conditions = new Condition[0];
                                ResetConditionList();

                                for (int i = 0; i < copy.Conditions.Length; i++)
                                {
                                    ExecutableNode dest   = FsmUtility.Copy(copy.Conditions[i]);
                                    transition.Conditions = ArrayUtility.Add <Condition>(transition.Conditions, (Condition)dest);
                                    FsmEditorUtility.ParentChilds(transition);
                                    NodeInspector.Dirty();
                                }
                            });
                        }
                        else
                        {
                            menu.AddDisabledItem(new GUIContent("Replace"));
                        }
                    }
                    else
                    {
                        menu.AddDisabledItem(new GUIContent("Paste After"));
                        menu.AddDisabledItem(new GUIContent("Paste Before"));
                        menu.AddDisabledItem(new GUIContent("Replace"));
                    }
                    menu.ShowAsContext();
                }),
            };
            this.host.Repaint();
            if (FsmEditor.instance != null)
            {
                FsmEditor.instance.Repaint();
            }
        }
Beispiel #4
0
        public static GenericMenu ExecutableContextMenu(ExecutableNode executable, Node node)
        {
            GenericMenu menu = new GenericMenu();

            if (executable == null)
            {
                return(menu);
            }
            menu.AddItem(new GUIContent("Enable"), executable.IsEnabled, delegate() {
                executable.IsEnabled = !executable.IsEnabled;
            });

            menu.AddSeparator("");

            menu.AddItem(new GUIContent("Find Script"), false, delegate() {
                MonoScript[] monoScriptArray = (MonoScript[])Resources.FindObjectsOfTypeAll(typeof(MonoScript));
                Selection.activeObject       = monoScriptArray.ToList().Find(x => x.GetClass() == executable.GetType());
            });

            menu.AddItem(new GUIContent("Edit Script"), false, delegate() {
                MonoScript[] monoScriptArray = (MonoScript[])Resources.FindObjectsOfTypeAll(typeof(MonoScript));
                Selection.activeObject       = monoScriptArray.ToList().Find(x => x.GetClass() == executable.GetType());
                AssetDatabase.OpenAsset(Selection.activeObject);
            });

            menu.AddSeparator("");

            bool moveDown     = false;
            int  currentIndex = -1;

            if (executable.GetType().IsSubclassOf(typeof(StateAction)))
            {
                State state = node as State;
                currentIndex = Array.IndexOf(state.Actions, executable);
                moveDown     = currentIndex + 1 < state.Actions.Length;
            }
            else
            {
                currentIndex = Array.IndexOf(FsmEditor.SelectedTransition.Conditions, executable);
                moveDown     = currentIndex + 1 < FsmEditor.SelectedTransition.Conditions.Length;
            }

            if (currentIndex - 1 >= 0)
            {
                menu.AddItem(new GUIContent("Move Up"), false, delegate() {
                    if (executable.GetType().IsSubclassOf(typeof(StateAction)))
                    {
                        State state   = node as State;
                        state.Actions = ArrayUtility.MoveItem(state.Actions, currentIndex, currentIndex - 1);
                    }
                    else
                    {
                        FsmEditor.SelectedTransition.Conditions = ArrayUtility.MoveItem(FsmEditor.SelectedTransition.Conditions, currentIndex, currentIndex - 1);
                    }
                    NodeInspector.Dirty();
                });
            }
            else
            {
                menu.AddDisabledItem(new GUIContent("Move Up"));
            }

            if (moveDown)
            {
                menu.AddItem(new GUIContent("Move Down"), false, delegate() {
                    if (executable.GetType().IsSubclassOf(typeof(StateAction)))
                    {
                        State state   = node as State;
                        state.Actions = ArrayUtility.MoveItem(state.Actions, currentIndex, currentIndex + 1);
                    }
                    else
                    {
                        FsmEditor.SelectedTransition.Conditions = ArrayUtility.MoveItem(FsmEditor.SelectedTransition.Conditions, currentIndex, currentIndex + 1);
                    }
                    NodeInspector.Dirty();
                });
            }
            else
            {
                menu.AddDisabledItem(new GUIContent("Move Down"));
            }

            menu.AddSeparator("");

            menu.AddItem(new GUIContent("Copy"), false, delegate() {
                executableCopy = executable;
            });

            if (executableCopy != null)
            {
                menu.AddItem(new GUIContent("Paste After"), false, delegate() {
                    ExecutableNode dest = FsmUtility.Copy(executableCopy);
                    if (dest.GetType().IsSubclassOf(typeof(StateAction)))
                    {
                        State state   = node as State;
                        state.Actions = ArrayUtility.Insert <StateAction>(state.Actions, (StateAction)dest, currentIndex + 1);
                    }
                    else
                    {
                        FsmEditor.SelectedTransition.Conditions = ArrayUtility.Insert <Condition>(FsmEditor.SelectedTransition.Conditions, (Condition)dest, currentIndex + 1);
                    }
                    FsmEditorUtility.ParentChilds(node);
                    NodeInspector.Dirty();
                });

                menu.AddItem(new GUIContent("Paste Before"), false, delegate() {
                    ExecutableNode dest = FsmUtility.Copy(executableCopy);
                    if (dest.GetType().IsSubclassOf(typeof(StateAction)))
                    {
                        State state   = node as State;
                        state.Actions = ArrayUtility.Insert <StateAction>(state.Actions, (StateAction)dest, currentIndex);
                    }
                    else
                    {
                        FsmEditor.SelectedTransition.Conditions = ArrayUtility.Insert <Condition>(FsmEditor.SelectedTransition.Conditions, (Condition)dest, currentIndex);
                    }
                    FsmEditorUtility.ParentChilds(node);
                    NodeInspector.Dirty();
                });


                menu.AddItem(new GUIContent("Replace"), false, delegate() {
                    ExecutableNode dest = FsmUtility.Copy(executableCopy);
                    if (dest.GetType().IsSubclassOf(typeof(StateAction)))
                    {
                        State state = node as State;
                        FsmEditorUtility.DestroyImmediate(state.Actions[currentIndex]);
                        state.Actions = ArrayUtility.RemoveAt <StateAction>(state.Actions, currentIndex);
                        state.Actions = ArrayUtility.Insert <StateAction>(state.Actions, (StateAction)dest, currentIndex);
                    }
                    else
                    {
                        FsmEditorUtility.DestroyImmediate(FsmEditor.SelectedTransition.Conditions[currentIndex]);
                        FsmEditor.SelectedTransition.Conditions = ArrayUtility.RemoveAt <Condition>(FsmEditor.SelectedTransition.Conditions, currentIndex);
                        FsmEditor.SelectedTransition.Conditions = ArrayUtility.Insert <Condition>(FsmEditor.SelectedTransition.Conditions, (Condition)dest, currentIndex);
                    }

                    FsmEditorUtility.ParentChilds(node);
                    NodeInspector.Dirty();
                });
            }
            else
            {
                menu.AddDisabledItem(new GUIContent("Paste After"));
                menu.AddDisabledItem(new GUIContent("Paste Before"));
                menu.AddDisabledItem(new GUIContent("Replace"));
            }
            menu.AddSeparator("");

            menu.AddItem(new GUIContent("Remove"), false, delegate() {
                if (executable.GetType().IsSubclassOf(typeof(StateAction)))
                {
                    State state   = node as State;
                    state.Actions = ArrayUtility.Remove <StateAction> (state.Actions, (StateAction)executable);
                }
                else
                {
                    FsmEditor.SelectedTransition.Conditions = ArrayUtility.Remove <Condition>(FsmEditor.SelectedTransition.Conditions, (Condition)executable);
                }

                FsmEditorUtility.DestroyImmediate(executable);
                NodeInspector.Dirty();
            });

            return(menu);
        }
Beispiel #5
0
        private void OnGUI()
        {
            GUILayout.BeginHorizontal();
            DoSearch();
            DoSettings();
            GUILayout.EndHorizontal();
            GUILayout.Space(2.0f);
            scroll = GUILayout.BeginScrollView(scroll);
            foreach (KeyValuePair <string, List <Type> > kvp in sortedTypes)
            {
                bool foldout = EditorPrefs.GetBool(kvp.Key, false);
                if (string.IsNullOrEmpty(searchString))
                {
                    if (GUILayout.Button(kvp.Key, (foldout?(GUIStyle)"TE toolbarbutton" : EditorStyles.toolbarButton)))
                    {
                        foldout = !foldout;
                        EditorPrefs.SetBool(kvp.Key, foldout);
                    }
                }
                else
                {
                    foldout = true;
                }

                if (foldout)
                {
                    foreach (Type actionType in kvp.Value)
                    {
                        if (!string.IsNullOrEmpty(searchString) && !actionType.Name.ToLower().StartsWith(searchString.ToLower()))
                        {
                            continue;
                        }
                        Color color = GUI.contentColor;
                        GUI.contentColor = (active != null && actionType == active.GetType() ? EditorStyles.foldout.focused.textColor : color);

                        if (GUILayout.Button(string.IsNullOrEmpty(searchString)?actionType.Name:actionType.GetCategory() + "." + actionType.Name, "label", GUILayout.ExpandWidth(true)))
                        {
                            DestroyActive();

                            ExecutableNode node = (ExecutableNode)ScriptableObject.CreateInstance(actionType);
                            node.hideFlags = HideFlags.HideAndDontSave;
                            node.name      = actionType.Name;
                            active         = node;

                            if ((EditorApplication.timeSinceStartup - clickTime) < doubleClickTime)
                            {
                                if (FsmEditor.Active != null)
                                {
                                    int selectedStatesCount = FsmEditor.SelectionCount;
                                    if (selectedStatesCount == 0)
                                    {
                                        EditorUtility.DisplayDialog("Could not add node " + active.GetType().Name + "!", "Select a state before adding nodes.", "Cancel");
                                    }
                                    else if (selectedStatesCount == 1)
                                    {
                                        Node selectedNode = FsmEditor.SelectedNodes[0];
                                        OnAddNode(selectedNode, active.GetType());
                                        NodeInspector.Dirty();
                                    }
                                    else
                                    {
                                        EditorUtility.DisplayDialog("Could not add node " + active.GetType().Name + "!", "Select only one state. Adding nodes to multiple states is not supported.", "Cancel");
                                    }
                                }
                            }

                            clickTime = EditorApplication.timeSinceStartup;
                        }
                        GUI.contentColor = color;
                    }
                }
            }
            GUILayout.EndScrollView();
            if (active != null)
            {
                OnPreviewGUI(active);
            }
        }
Beispiel #6
0
        private void ResetActionList()
        {
            this.actions    = this.state.Actions;
            this.actionList = new ReorderableList(this.actions, "Action", true, true)
            {
                drawElementCallback = new ReorderableList.ElementCallbackDelegate(this.OnActionElement),
                onReorderCallback   = new ReorderableList.ReorderCallbackDelegate(this.OnReorderList),
                onAddCallback       = new ReorderableList.AddCallbackDelegate(delegate(){
                    FsmGUIUtility.SubclassMenu <StateAction> (CreateAction);
                }),
                onContextClick = new ReorderableList.ContextCallbackDelegate(delegate(int index){
                    FsmGUIUtility.ExecutableContextMenu(actions[index], state).ShowAsContext();
                }),
                onHeaderClick = new ReorderableList.OnHeaderClick(delegate(){
                    GenericMenu menu = new GenericMenu();

                    if (actions.Length > 0)
                    {
                        menu.AddItem(new GUIContent("Copy"), false, delegate {
                            copy      = new List <StateAction>(actions);
                            copyState = state;
                        });
                    }
                    else
                    {
                        menu.AddDisabledItem(new GUIContent("Copy"));
                    }

                    if (copy == null)
                    {
                        copy = new List <StateAction>();
                    }

                    copy.RemoveAll(x => x == null);
                    if (copy.Count > 0)
                    {
                        menu.AddItem(new GUIContent("Paste After"), false, delegate() {
                            for (int i = 0; i < copy.Count; i++)
                            {
                                ExecutableNode dest = FsmUtility.Copy(copy[i]);
                                state.Actions       = ArrayUtility.Add <StateAction>(state.Actions, (StateAction)dest);
                                FsmEditorUtility.ParentChilds(state);
                                NodeInspector.Dirty();
                            }
                        });
                        menu.AddItem(new GUIContent("Paste Before"), false, delegate() {
                            for (int i = 0; i < copy.Count; i++)
                            {
                                ExecutableNode dest = FsmUtility.Copy(copy[i]);
                                state.Actions       = ArrayUtility.Insert <StateAction>(state.Actions, (StateAction)dest, 0);
                                FsmEditorUtility.ParentChilds(state);
                                NodeInspector.Dirty();
                            }
                        });
                        if (copyState != state)
                        {
                            menu.AddItem(new GUIContent("Replace"), false, delegate() {
                                for (int i = 0; i < state.Actions.Length; i++)
                                {
                                    FsmEditorUtility.DestroyImmediate(state.Actions[i]);
                                }
                                state.Actions = new StateAction[0];
                                ResetActionList();

                                for (int i = 0; i < copy.Count; i++)
                                {
                                    ExecutableNode dest = FsmUtility.Copy(copy[i]);
                                    state.Actions       = ArrayUtility.Add <StateAction>(state.Actions, (StateAction)dest);
                                    FsmEditorUtility.ParentChilds(state);
                                    NodeInspector.Dirty();
                                }
                            });
                        }
                        else
                        {
                            menu.AddDisabledItem(new GUIContent("Replace"));
                        }
                    }
                    else
                    {
                        menu.AddDisabledItem(new GUIContent("Paste After"));
                        menu.AddDisabledItem(new GUIContent("Paste Before"));
                        menu.AddDisabledItem(new GUIContent("Replace"));
                    }
                    menu.ShowAsContext();
                }),
            };
            this.host.Repaint();
            if (FsmEditor.instance != null)
            {
                FsmEditor.instance.Repaint();
            }
        }