Ejemplo n.º 1
0
    public override void DrawWindow()
    {
        if (BehaviorEditor.currentGraph == null)
        {
            EditorGUILayout.LabelField("Add graph to modify:");
        }

        BehaviorEditor.currentGraph = (BehaviourGraph)EditorGUILayout.ObjectField(BehaviorEditor.currentGraph, typeof(BehaviourGraph), false);


        if (BehaviorEditor.currentGraph == null)
        {
            if (previousGraph != null)
            {
                previousGraph = null;
            }
            EditorGUILayout.LabelField("No graph assigned");
            return;
        }

        if (previousGraph != BehaviorEditor.currentGraph)
        {
            previousGraph = BehaviorEditor.currentGraph;
        }
    }
Ejemplo n.º 2
0
        public void Load(BehaviourGraph graph)
        {
            if (graph == null)
            {
                return;
            }

            _graph = graph;

            DeleteElements(edges.ToList());
            DeleteElements(nodes.ToList());
            Properties.Clear();
            Blackboard.Clear();

            foreach (var variable in graph.Variables)
            {
                AddExposedProperty(new ExposedProperty
                {
                    Name     = variable.Name,
                    Type     = variable.Type,
                    IsGlobal = variable.IsGlobal
                });
            }

            NodeDeserializer.Deserialize(graph.BehaviorSource.TaskData, this);
        }
Ejemplo n.º 3
0
        public void Save(BehaviourGraph graph)
        {
            graph.Links.Clear();

            if (graph == null)
            {
                return;
            }

            foreach (var edge in edges.ToList())
            {
                var inputNode  = edge.input.node as TaskNode;
                var outputNode = edge.output.node as TaskNode;

                graph.Links.Add(new NodeLink
                {
                    SourceGuid = outputNode.GUID,
                    TargetGuid = inputNode.GUID
                });
            }

            graph.NodesData.Clear();

            foreach (var node in nodes.ToList().Cast <TaskNode>())
            {
                graph.NodesData.Add(new NodeData
                {
                    GUID     = node.GUID,
                    Position = node.GetPosition().position,
                    Type     = node.Type,
                    Data     = node.Data
                });
            }

            var id    = 0;
            var entry = graph.NodesData.FirstOrDefault(x => x.Type == typeof(EntryTask));

            if (entry != null)
            {
                AssignID(entry, ref id);
            }

            graph.Variables.Clear();

            foreach (var variable in Properties)
            {
                graph.Variables.Add(new Variable
                {
                    Name     = variable.Name,
                    Type     = variable.Type,
                    IsGlobal = variable.IsGlobal
                });
            }

            graph.BehaviorSource.TaskData = NodeSerializer.Serialize(graph);

            EditorUtility.SetDirty(graph);
            AssetDatabase.SaveAssets();
        }
Ejemplo n.º 4
0
        /// <summary>
        /// A bootstrap hack to create a root node on creation.
        /// </summary>
        public override void OnCreate()
        {
            BehaviourGraph bg = target as BehaviourGraph;

            Debug.Assert(bg != null, nameof(bg) + " != null");
            bg.EditorTimeInitialization();
            base.OnCreate();
        }
Ejemplo n.º 5
0
        public void OpenGraph(BehaviourGraph openGraph)
        {
            targetGraph       = openGraph;
            dragging_Position = Vector2.zero;
            ResetView();

            Repaint();
        }
Ejemplo n.º 6
0
        private void DrawTopBar()
        {
            EditorGUILayout.BeginHorizontal(EditorStyles.toolbar, GUILayout.ExpandWidth(true));

            if (GUILayout.Button("Load Graph", EditorStyles.toolbarButton, GUILayout.Width(100)))
            {
                controlID = GUIUtility.GetControlID(FocusType.Passive);
                EditorGUIUtility.ShowObjectPicker <BehaviourGraph> (targetGraph, false, "", controlID);
            }

            string commandName = currentEvent.commandName;

            if (commandName == "ObjectSelectorUpdated")
            {
                Repaint();
            }
            else if (commandName == "ObjectSelectorClosed")
            {
                if (EditorGUIUtility.GetObjectPickerControlID() == controlID)
                {
                    BehaviourGraph nextGraph = EditorGUIUtility.GetObjectPickerObject() as BehaviourGraph;

                    if (nextGraph == null)
                    {
                        // CloseGraph ();
                    }
                    else
                    {
                        if (targetGraph != nextGraph)
                        {
                            OpenGraph(nextGraph.GetInstanceID(), 0);
                        }
                    }
                    return;
                }
            }

            GUILayout.Space(5.0f);

            EditorGUI.BeginDisabledGroup(targetGraph == null);
            if (GUILayout.Button("Goto Asset", EditorStyles.toolbarButton, GUILayout.Width(100)))
            {
                EditorUtility.FocusProjectWindow();
                EditorGUIUtility.PingObject(targetGraph);
            }
            EditorGUI.EndDisabledGroup();

            GUILayout.FlexibleSpace();

            if (GUILayout.Button("Screenshot", EditorStyles.toolbarButton, GUILayout.Width(100)))
            {
                screenshot_TakeScreenshot = true;
                Repaint();
                EditorApplication.delayCall += Repaint;
            }
            EditorGUILayout.EndHorizontal();
        }
Ejemplo n.º 7
0
        protected override void Init()
        {
            if (initialized)
            {
                return;
            }

            parentGraph = graph as BehaviourGraph;
            UnityEngine.Debug.Assert(parentGraph != null, nameof(parentGraph) + " != null");

            initialized = true;
            OnCreation();
        }
Ejemplo n.º 8
0
        private static JToken SerializeVariables(BehaviourGraph graph)
        {
            var ret = new JArray();

            foreach (var variable in graph.Variables)
            {
                if (variable.IsGlobal)
                {
                    continue;
                }

                var instance = Activator.CreateInstance(variable.Type) as SharedVariable;
                instance.Name     = variable.Name;
                instance.IsShared = true;
                ret.Add(JToken.FromObject(instance, Serializer));
            }
            return(ret);
        }
Ejemplo n.º 9
0
        private void HandleDragAndDrop(Rect dropArea)
        {
            if (dropArea.Contains(Event.current.mousePosition))
            {
                if (!IsValidImport(DragAndDrop.objectReferences))
                {
                    // DragAndDrop.visualMode = DragAndDropVisualMode.Rejected;
                    return;
                }

                DragAndDrop.visualMode = DragAndDropVisualMode.Generic;

                if (Event.current.type == EventType.DragPerform)
                {
                    DragAndDrop.AcceptDrag();

                    for (int i = 0; i < DragAndDrop.objectReferences.Length; i++)
                    {
                        object importObject = DragAndDrop.objectReferences[i];


                        if (importObject.GetType() == typeof(MonoScript))
                        {
                            MonoScript monoScriptImport = (MonoScript)importObject;

                            Type monoScriptType = monoScriptImport.GetClass();
                            if (monoScriptType != null &&
                                typeof(BehaviourNode).IsAssignableFrom(monoScriptType))
                            {
                                AddNodeCallback(monoScriptType, Event.current.mousePosition);
                            }
                        }
                        else if (typeof(BehaviourGraph).IsAssignableFrom(importObject.GetType()))
                        {
                            BehaviourGraph graphImport = (BehaviourGraph)importObject;

                            OpenGraph(graphImport);
                        }
                    }
                }
            }
        }
Ejemplo n.º 10
0
        private static JToken SerializeNode(BehaviourGraph graph, NodeData node, List <UnityEngine.Object> objects, bool withChildren = true)
        {
            if (node == null)
            {
                return(null);
            }

            var obj = new JObject();

            obj.Add("Type", JToken.FromObject(EvaluateType(node.Type), Serializer));
            obj.Add("ID", JToken.FromObject(node.Data.ID, Serializer));
            obj.Add("Name", JToken.FromObject(node.Data.FriendlyName, Serializer));
            obj.Add("Instant", JToken.FromObject(node.Data.IsInstant, Serializer));
            obj.Add("NodeData", new JObject
            {
                ["Offset"] = JToken.FromObject(node.Position, Serializer)
            });

            WriteFields(node.Type, node.Data, obj, graph, objects);

            if (!withChildren)
            {
                return(obj);
            }

            var children = graph.GetLinked(node).ToList();

            if (children.Count > 0)
            {
                var array = new JArray();
                foreach (var child in children)
                {
                    array.Add(SerializeNode(graph, child, objects));
                }
                obj.Add("Children", array);
            }

            return(obj);
        }
Ejemplo n.º 11
0
        public BehaviourGraphView(EditorWindow window, BehaviourGraph graph)
        {
            SetupZoom(ContentZoomer.DefaultMinScale, ContentZoomer.DefaultMaxScale);

            this.AddManipulator(new ContentDragger());
            this.AddManipulator(new SelectionDragger());
            this.AddManipulator(new RectangleSelector());
            this.AddManipulator(new FreehandSelector());

            graphViewChanged = OnGraphViewChanged;

            _graph = graph;

            _searchWindow = ScriptableObject.CreateInstance <NodeSearchWindow>();
            _searchWindow.Init(window, this);
            nodeCreationRequest = context =>
                                  SearchWindow.Open(new SearchWindowContext(context.screenMousePosition), _searchWindow);

            _inspectorObject           = ScriptableObject.CreateInstance <InspectorObject>();
            _inspectorObject.name      = "Node Inspector";
            _inspectorObject.hideFlags = HideFlags.HideAndDontSave ^ HideFlags.NotEditable;
            _inspectorObject.View      = this;

            Properties = new List <ExposedProperty>();

            RegisterCallback <MouseUpEvent>(OnMouseUp);
            RegisterCallback <MouseDownEvent>(OnMouseDown);

            RegisterCallback <KeyDownEvent>(OnKeyDown);

            styleSheets.Add(Resources.Load <StyleSheet>("Styles/GraphView"));

            Insert(0, new GridBackground());

            Undo.undoRedoPerformed += UpdateInspectorSelection;
        }
Ejemplo n.º 12
0
        public static TaskSerializationData Serialize(BehaviourGraph graph)
        {
            var data = new TaskSerializationData();

            var entry = graph.NodesData.FirstOrDefault(x => x.Type == typeof(EntryTask));

            if (entry == null)
            {
                Debug.LogWarning($"Graph {AssetDatabase.GetAssetPath(graph)} has no Entry node and will be left empty");
                return(data);
            }

            var nodes = graph.GetLinked(entry);
            var root  = nodes.FirstOrDefault();

            var objects = new List <UnityEngine.Object>();

            var node = new JObject
            {
                { "EntryTask", SerializeNode(graph, entry, objects, false) },
                { "RootTask", SerializeNode(graph, root, objects) },
                { "Variables", SerializeVariables(graph) }
            };

            var sb = new StringBuilder();

            Serializer.Serialize(new StringWriter(sb), node);

            data.JSONSerialization      = sb.ToString();
            data.Version                = "1.5.7";
            data.fieldSerializationData = new FieldSerializationData {
                unityObjects = objects
            };

            return(data);
        }
Ejemplo n.º 13
0
 public void CloseGraph()
 {
     targetGraph = null;
 }
Ejemplo n.º 14
0
        private static void WriteFields(Type type, object target, JObject obj, BehaviourGraph graph, List <UnityEngine.Object> objects)
        {
            foreach (var field in GetSerializedFields(type))
            {
                try
                {
                    var value = field.GetValue(target);
                    if (value is SharedVariable shared)
                    {
                        var variable = graph.Variables.FirstOrDefault(x => x.Name == shared.Name);
                        if (variable != null)
                        {
                            shared.IsGlobal = variable.IsGlobal;
                        }

                        var sValue = shared.GetValue();
                        if (sValue is UnityEngine.Object sObject)
                        {
                            var idx = objects.FindIndex(x => ReferenceEquals(x, sObject));
                            if (idx == -1)
                            {
                                objects.Add(sObject);
                                idx = objects.FindIndex(x => ReferenceEquals(x, sObject));
                            }
                            shared.PropertyMapping = idx.ToString();
                        }
                    }
                    else if (value is UnityEngine.Object sObject)
                    {
                        var idx = objects.FindIndex(x => ReferenceEquals(x, sObject));
                        if (idx == -1)
                        {
                            objects.Add(sObject);
                            idx = objects.FindIndex(x => ReferenceEquals(x, sObject));
                        }
                        obj.Add(field.FieldType.Name + field.Name, JToken.FromObject(idx, Serializer));
                        continue;
                    }
                    else if (IsTaskReference(field.FieldType))
                    {
                        if (field.FieldType.IsArray)
                        {
                            var array = value as Array;
                            var idx   = new List <int>();
                            for (var i = 0; i < array.Length; i++)
                            {
                                value = array.GetValue(i);
                                var task = graph.NodesData.FirstOrDefault(x => x.Data == value);
                                if (task != null)
                                {
                                    idx.Add(task.Data.ID);
                                }
                            }
                            obj.Add(field.FieldType.Name + field.Name, JToken.FromObject(idx, Serializer));
                        }
                        else
                        {
                            var task = graph.NodesData.FirstOrDefault(x => x.Data == value);
                            if (task != null)
                            {
                                obj.Add(field.FieldType.Name + field.Name, JToken.FromObject(task.Data.ID, Serializer));
                            }
                        }
                        continue;
                    }

                    var name = field.FieldType.Name + field.Name;
                    if (HasConverter.Any(x => x.IsAssignableFrom(field.FieldType)))
                    {
                        if (value != null && !obj.ContainsKey(name))
                        {
                            obj.Add(name, JToken.FromObject(value, Serializer));
                        }
                    }
                    else if (value != null)
                    {
                        if (field.FieldType.IsPrimitive || field.FieldType == typeof(string) || field.FieldType.IsEnum)
                        {
                            obj.Add(name, JToken.FromObject(value, Serializer));
                        }
                        else
                        {
                            var container = new JObject();
                            WriteFields(field.FieldType, value, container, graph, objects);
                            obj.Add(name, container);
                        }
                    }
                }
                catch (Exception e)
                {
                    Debug.Log(e);
                }
            }
        }