Пример #1
0
 public void DeleteCommentBox(CommentBoxView commentBoxView)
 {
     if (CurrentCommentBoxViewList.Contains(commentBoxView))
     {
         CurrentCommentBoxViewList.Remove(commentBoxView);
     }
 }
Пример #2
0
        private static CommentBoxView ParseCommentBoxInfo(CommentBoxInfo commentBoxInfo, GraphEditorWindow graph)
        {
            Vector2 startPositionInGraph = commentBoxInfo.positionInGraph;
            Vector2 boxSize            = commentBoxInfo.size;
            Vector2 endPositionInGraph = new Vector2(startPositionInGraph.x + boxSize.x, startPositionInGraph.y + boxSize.y);

            CommentBoxView commentBoxView =
                new CommentBoxView(graph, startPositionInGraph, endPositionInGraph, commentBoxInfo.comment);

            return(commentBoxView);
        }
Пример #3
0
        private static CommentBoxInfo ConvertToCommentInfo(CommentBoxView commentBoxView)
        {
            CommentBoxInfo commentBoxInfo = new CommentBoxInfo
            {
                comment         = commentBoxView.comment,
                positionInGraph = commentBoxView.rectInGraph.position,
                size            = commentBoxView.rectInGraph.size
            };

            return(commentBoxInfo);
        }
Пример #4
0
        void OpenCommentBoxGenericMenu(CommentBoxView commentBoxView, Vector2 mousePosition)
        {
            GenericMenu genericMenu = new GenericMenu();

            genericMenu.AddItem(new GUIContent("删除注释框"), false, () =>
            {
                if (commentBoxView == null)
                {
                    return;
                }

                data.DeleteCommentBox(commentBoxView);
            });

            genericMenu.ShowAsContext();
        }
Пример #5
0
        private void DrawCommentBox()
        {
            if (controlType == ControlType.DraggingNewCommentBox)
            {
                CommentBoxView.DrawDraggingCommentBox(this, startDraggingCommentBoxGraphPosition,
                                                      endDraggingCommentBoxGraphPosition);
            }

            if (data.CurrentCommentBoxViewList.Count > 0)
            {
                for (int i = 0; i < data.CurrentCommentBoxViewList.Count; i++)
                {
                    CommentBoxView commentBoxView = data.CurrentCommentBoxViewList[i];
                    commentBoxView.Draw();
                }
            }
        }
Пример #6
0
        private void Update()
        {
            if (EditorApplication.timeSinceStartup - repaintTimer > 0.03)
            {
                repaintTimer = EditorApplication.timeSinceStartup;
                Repaint();
            }

            //重置双击状态
            if (lastClickCommentBox != null)
            {
                double currentTime = EditorApplication.timeSinceStartup;
                if (currentTime - lastClickCommentTime > 0.3f)
                {
                    lastClickCommentBox = null;
                }
            }
        }
Пример #7
0
        void ProcessEvent(Event e)
        {
            Vector2 windowMousePosition = e.mousePosition;
            Vector2 zoomedMousePosition = NonZoomedWindowPositionToZoomedWindowPosition(windowMousePosition);

            List <NodeEditorView>     nodeViewList           = data.CurrentNodeList;
            List <ConnectionLineView> connectionLineViewList = data.CurrentConnectionLineList;

            bool hasHoveredNodeOrPort = false;
            //如果在输入标签上,要屏蔽与注释框的交互
            bool hasHoverdNodeInputLabel = false;

            for (int i = 0; i < nodeViewList.Count; i++)
            {
                NodeEditorView nodeView = nodeViewList[i];

                #region 提示框鼠标悬浮显示

                //在没有任何操作的时候,才显示tips框
                if (controlType == ControlType.None && !hasHoveredNodeOrPort)
                {
                    if (nodeView.NodeNameRect.Contains(zoomedMousePosition))
                    {
                        //reset time
                        if (currentHoverNodeView != nodeView)
                        {
                            startHoverdTime = EditorApplication.timeSinceStartup;
                        }

                        hasHoveredNodeOrPort = true;
                        currentHoverNodeView = nodeView;
                        currentHoverPortView = null;
                    }

                    if (!hasHoveredNodeOrPort)
                    {
                        List <PortEditorView> allPortList = nodeView.allPortList;
                        for (int j = 0; j < allPortList.Count; j++)
                        {
                            PortEditorView portView = allPortList[j];
                            if (portView.portViewRect.Contains(zoomedMousePosition))
                            {
                                //reset time
                                if (currentHoverPortView != portView)
                                {
                                    startHoverdTime = EditorApplication.timeSinceStartup;
                                }

                                hasHoveredNodeOrPort = true;
                                currentHoverPortView = portView;
                                currentHoverNodeView = null;

                                break;
                            }

                            if (portView is InputPortEditorView)
                            {
                                InputPortEditorView inputView = portView as InputPortEditorView;
                                if (inputView.IsInputLabelContains(zoomedMousePosition))
                                {
                                    hasHoverdNodeInputLabel = true;
                                }
                            }
                        }
                    }
                }

                #endregion

                if (controlType == ControlType.None && e.type == EventType.MouseDown && e.button == 0)
                {
                    //点击开始拖拽连线
                    List <PortEditorView> allPortList = nodeView.allPortList;
                    for (int j = 0; j < allPortList.Count; j++)
                    {
                        PortEditorView portView = allPortList[j];
                        if (portView.connectionCircleRect.Contains(zoomedMousePosition))
                        {
                            controlType      = ControlType.DraggingConnection;
                            draggingLineView = new ConnectionLineView(portView);
                            draggingLineView.SetEndPos(zoomedMousePosition);
                            e.Use();
                            break;
                        }
                    }

                    //开始拖拽节点
                    if (nodeView.viewRect.Contains(zoomedMousePosition))
                    {
                        if (data.selectedNodeList.Contains(nodeView))
                        {
                            controlType = ControlType.DraggingMultiNodes;
                        }
                        else
                        {
                            controlType      = ControlType.DraggingNode;
                            draggingNodeView = nodeView;
                            data.PutNodeToListTail(i);
                        }

                        e.Use();
                        break;
                    }
                }

                //节点右键菜单
                if (controlType == ControlType.None && e.type == EventType.MouseDown && e.button == 1)
                {
                    if (nodeView.viewRect.Contains(zoomedMousePosition))
                    {
                        OpenNodeGenericMenu(nodeView, e.mousePosition);
                        e.Use();
                        break;
                    }
                }
            }

            if (currentHoverConnectionLineView != null)
            {
                currentHoverConnectionLineView.SetHovering(false);
            }

            currentHoverConnectionLineView = null;
            if (controlType == ControlType.None)
            {
                //和连接线的交互
                for (int i = 0; i < connectionLineViewList.Count; i++)
                {
                    ConnectionLineView connectionLineView = connectionLineViewList[i];
                    if (connectionLineView.IsPositionCloseToLine(zoomedMousePosition))
                    {
                        currentHoverConnectionLineView = connectionLineView;
                        currentHoverConnectionLineView.SetHovering(true);

                        //右键点击连线
                        if (e.type == EventType.MouseDown && e.button == 1)
                        {
                            OpenConnectionLineGenericMenu(connectionLineView, e.mousePosition);
                            e.Use();
                        }

                        break;
                    }
                }
            }

            if (!hasHoveredNodeOrPort)
            {
                currentHoverPortView = null;
                currentHoverNodeView = null;
            }

            if (controlType == ControlType.DraggingNode && e.type == EventType.MouseDrag && e.button == 0)
            {
                draggingNodeView.Drag(e.delta / data.GraphZoom);
                e.Use();
            }

            if (controlType == ControlType.DraggingNode && e.type == EventType.MouseUp && e.button == 0)
            {
                controlType      = ControlType.None;
                draggingNodeView = null;
                e.Use();
            }

            if (controlType == ControlType.DraggingMultiNodes && e.type == EventType.MouseDrag && e.button == 0)
            {
                for (int i = 0; i < data.selectedNodeList.Count; i++)
                {
                    data.selectedNodeList[i].Drag(e.delta / data.GraphZoom);
                }

                e.Use();
            }

            if (controlType == ControlType.DraggingMultiNodes && e.type == EventType.MouseUp && e.button == 0)
            {
                controlType = ControlType.None;

                e.Use();
            }

            if (controlType == ControlType.DraggingConnection && e.type == EventType.MouseDrag && e.button == 0)
            {
                if (draggingLineView != null)
                {
                    draggingLineView.SetEndPos(zoomedMousePosition);
                }
            }

            if (controlType == ControlType.DraggingConnection && e.type == EventType.MouseUp && e.button == 0)
            {
                if (draggingLineView != null)
                {
                    bool createNewConnection = false;
                    //检查是否有连接
                    for (int i = 0; i < nodeViewList.Count; i++)
                    {
                        NodeEditorView        nodeView    = nodeViewList[i];
                        List <PortEditorView> allPortList = nodeView.allPortList;
                        for (int j = 0; j < allPortList.Count; j++)
                        {
                            PortEditorView portView = allPortList[j];

                            if (portView.connectionCircleRect.Contains(zoomedMousePosition))
                            {
                                if (ConnectionLineView.CheckPortsCanLine(draggingLineView.draggingPort, portView))
                                {
                                    ConnectionLineView newConnectionLine =
                                        new ConnectionLineView(draggingLineView.draggingPort, portView, data);
                                    data.connectionLineList.Add(newConnectionLine);
                                    data.CurrentConnectionLineList.Add(newConnectionLine);

                                    createNewConnection = true;
                                    break;
                                }
                            }
                        }

                        if (createNewConnection)
                        {
                            break;
                        }
                    }

                    draggingLineView.Dispose();
                }

                draggingLineView = null;
                controlType      = ControlType.None;
                e.Use();
            }

            //中键拖动面板
            if (e.type == EventType.MouseDrag && e.button == 2)
            {
                data.GraphOffset += e.delta / data.GraphZoom;
                e.Use();

                if (draggingLineView != null)
                {
                    draggingLineView.SetEndPos(zoomedMousePosition);
                }
            }

            //滚轮控制缩放
            if (e.type == EventType.ScrollWheel)
            {
                data.GraphZoom -= e.delta.y / GraphEditorData.GraphZoomSpeed;
                data.GraphZoom  = Mathf.Clamp(data.GraphZoom, GraphEditorData.MinGraphZoom, GraphEditorData.MaxGraphZoom);
                e.Use();

                if (draggingLineView != null)
                {
                    draggingLineView.SetEndPos(zoomedMousePosition);
                }
            }


            //记录左ctrl按下状态
            if (e.type == EventType.KeyDown && e.keyCode == KeyCode.LeftControl)
            {
                isCtrlDown = true;
            }

            //记录左ctrl按下状态
            if (e.type == EventType.KeyUp && e.keyCode == KeyCode.LeftControl)
            {
                isCtrlDown = false;

                if (controlType == ControlType.DraggingNewCommentBox)
                {
                    controlType = ControlType.None;
                }
            }

            //开始拖拽新的注释框
            if (isCtrlDown && controlType == ControlType.None && e.type == EventType.MouseDown && e.button == 0)
            {
                controlType = ControlType.DraggingNewCommentBox;
                startDraggingCommentBoxGraphPosition = WindowPositionToGraphPosition(windowMousePosition);
                endDraggingCommentBoxGraphPosition   = startDraggingCommentBoxGraphPosition;

                e.Use();
            }

            //更新新的注释框
            if (controlType == ControlType.DraggingNewCommentBox && e.type == EventType.MouseDrag && e.button == 0)
            {
                endDraggingCommentBoxGraphPosition = WindowPositionToGraphPosition(windowMousePosition);
                e.Use();
            }

            //结束新的注释框
            if (isCtrlDown && controlType == ControlType.DraggingNewCommentBox && e.type == EventType.MouseUp && e.button == 0)
            {
                controlType = ControlType.None;

                CommentBoxView newCommentBox = new CommentBoxView(this, startDraggingCommentBoxGraphPosition,
                                                                  endDraggingCommentBoxGraphPosition);
                data.CurrentCommentBoxViewList.Add(newCommentBox);

                e.Use();
            }

            //注释框操作
            if (data.CurrentCommentBoxViewList.Count > 0 && !hasHoverdNodeInputLabel)
            {
                for (int i = 0; i < data.CurrentCommentBoxViewList.Count; i++)
                {
                    CommentBoxView commentBoxView = data.CurrentCommentBoxViewList[i];

                    //右键点击注释框
                    if (controlType == ControlType.None && e.type == EventType.MouseDown && e.button == 1)
                    {
                        if (commentBoxView.Contains(zoomedMousePosition))
                        {
                            OpenCommentBoxGenericMenu(commentBoxView, e.mousePosition);
                            e.Use();
                            break;
                        }
                    }

                    //拖拽编辑注释区域大小
                    if (controlType == ControlType.None && (e.type != EventType.Layout || e.type != EventType.Repaint))
                    {
                        CommentBoxView.BoxEdge boxEdge = commentBoxView.AtEdge(zoomedMousePosition);
                        if (boxEdge != CommentBoxView.BoxEdge.None)
                        {
                            MouseCursor cursorMode =
                                (boxEdge == CommentBoxView.BoxEdge.Left || boxEdge == CommentBoxView.BoxEdge.Right)
                                    ? MouseCursor.ResizeHorizontal
                                    : MouseCursor.ResizeVertical;
                            EditorGUIUtility.AddCursorRect(guiRect, cursorMode);

                            //开始拖拽扩大
                            if (e.type == EventType.MouseDown && e.button == 0)
                            {
                                resizingCommentEdge = boxEdge;
                                resizingCommentBox  = commentBoxView;
                                controlType         = ControlType.ResizingCommentBox;

                                e.Use();
                            }

                            break;
                        }
                    }

                    //双击编辑注释
                    if ((controlType == ControlType.None || controlType == ControlType.DraggingCommentBox) &&
                        e.type == EventType.MouseDown && e.button == 0)
                    {
                        if (commentBoxView.Contains(zoomedMousePosition))
                        {
                            if (lastClickCommentBox == null || lastClickCommentBox != commentBoxView)
                            {
//                                Debug.Log("click once");
                                //一次点击可能是要拖拽了
                                controlType          = ControlType.DraggingCommentBox;
                                lastClickCommentBox  = commentBoxView;
                                draggingCommentBox   = commentBoxView;
                                lastClickCommentTime = EditorApplication.timeSinceStartup;
                                e.Use();
                                break;
                            }
                            else if (lastClickCommentBox == commentBoxView)
                            {
                                double currentTime = EditorApplication.timeSinceStartup;
                                if (currentTime - lastClickCommentTime <= 0.3f)
                                {
//                                    Debug.Log("click twice");
                                    controlType = ControlType.EditingComment;
                                    lastClickCommentBox.EnableEditComment(true);
                                    editingCommentBox   = lastClickCommentBox;
                                    lastClickCommentBox = null;
                                    e.Use();
                                    break;
                                }
                                else
                                {
//                                    Debug.Log("click twice failed");
                                    lastClickCommentBox = null;
                                }
                            }
                        }
                    }
                }
            }

            //右键点击面板
            if (e.type == EventType.MouseDown && e.button == 1)
            {
                OpenGraphGenericMenu(e.mousePosition);
                e.Use();
            }

            //改变注释框大小的时候,改变鼠标图标
            if (controlType == ControlType.ResizingCommentBox)
            {
                MouseCursor cursorMode =
                    (resizingCommentEdge == CommentBoxView.BoxEdge.Left || resizingCommentEdge == CommentBoxView.BoxEdge.Right)
                        ? MouseCursor.ResizeHorizontal
                        : MouseCursor.ResizeVertical;
                EditorGUIUtility.AddCursorRect(guiRect, cursorMode);
            }

            //编辑注释框大小
            if (controlType == ControlType.ResizingCommentBox && e.type == EventType.MouseDrag && e.button == 0)
            {
                if (resizingCommentBox != null)
                {
                    if (resizingCommentEdge != CommentBoxView.BoxEdge.None)
                    {
                        resizingCommentBox.Resizing(resizingCommentEdge, e.delta / data.GraphZoom);
                        e.Use();
                    }
                }
            }

            //停止编辑注释框大小
            if (controlType == ControlType.ResizingCommentBox && e.type == EventType.MouseUp && e.button == 0)
            {
                controlType         = ControlType.None;
                resizingCommentBox  = null;
                resizingCommentEdge = CommentBoxView.BoxEdge.None;
                e.Use();
            }

            //拖拽注释框
            if (controlType == ControlType.DraggingCommentBox && draggingCommentBox != null && e.type == EventType.MouseDrag &&
                e.button == 0)
            {
                if (draggingCommentBox.Contains(zoomedMousePosition))
                {
                    draggingCommentBox.Drag(data.CurrentNodeList, e.delta / data.GraphZoom);
                    e.Use();
                }
            }

            //停止拖拽注释框
            if (controlType == ControlType.DraggingCommentBox && draggingCommentBox != null && e.type == EventType.MouseUp &&
                e.button == 0)
            {
                draggingCommentBox = null;
                controlType        = ControlType.None;
                e.Use();
            }

            //停止编辑注释框
            if (e.type == EventType.MouseDown)
            {
                if (controlType == ControlType.EditingComment)
                {
                    if (!editingCommentBox.Contains(zoomedMousePosition))
                    {
                        controlType = ControlType.None;
                        editingCommentBox.EnableEditComment(false);
                        editingCommentBox = null;
                        GUI.FocusControl(null);
                        e.Use();
                    }
                }
                else
                {
                    data.ClearSelectedNode();
                    GUI.FocusControl(null);
                }
            }

            //开始多选框
            if (controlType == ControlType.None && e.type == EventType.MouseDrag && e.button == 0)
            {
                startMultiSelectionPos = e.mousePosition;
                controlType            = ControlType.DraggingMultiSelection;
                e.Use();
            }

            //更新多选框
            if (controlType == ControlType.DraggingMultiSelection)
            {
                Rect multiSelectionRect = new Rect();
                multiSelectionRect.position = NonZoomedWindowPositionToZoomedWindowPosition(startMultiSelectionPos);
                multiSelectionRect.max      = NonZoomedWindowPositionToZoomedWindowPosition(e.mousePosition);
                data.UpdateSelectedNode(multiSelectionRect);
            }

            //结束多选框
            if (controlType == ControlType.DraggingMultiSelection && e.type == EventType.MouseUp && e.button == 0)
            {
                controlType = ControlType.None;
                e.Use();
            }

            //排除掉鼠标移出去之后,多选框还会继续拖拽的问题
            if (!guiRect.Contains(e.mousePosition) && e.type != EventType.Layout && e.type != EventType.Repaint)
            {
                if (controlType == ControlType.DraggingMultiSelection)
                {
                    controlType = ControlType.None;
                    e.Use();
                }
            }
        }
Пример #8
0
        public static GraphEditorData LoadGraph(GraphEditorWindow graph, int graphId)
        {
            GraphEditorData resultData = new GraphEditorData();

            string graphEditorConfigFilePath = Path.Combine(Application.dataPath,
                                                            string.Format("FlatNode/Editor/GraphSavedConfig/{0}.json", graphId));

            if (!File.Exists(graphEditorConfigFilePath))
            {
                Debug.LogErrorFormat("无法载入行为图配置文件: {0}", graphEditorConfigFilePath);
            }

            string          jsonString      = File.ReadAllText(graphEditorConfigFilePath);
            GraphConfigInfo graphConfigInfo = new GraphConfigInfo();

            EditorJsonUtility.FromJsonOverwrite(jsonString, graphConfigInfo);

            //处理注释框
            for (int i = 0; i < graphConfigInfo.commentBoxInfoList.Count; i++)
            {
                CommentBoxInfo commentBoxInfo = graphConfigInfo.commentBoxInfoList[i];
                CommentBoxView commentBoxView = ParseCommentBoxInfo(commentBoxInfo, graph);

                resultData.commentBoxViewList.Add(commentBoxView);
            }

            //变量
            for (int i = 0; i < graphConfigInfo.graphVariableInfoList.Count; i++)
            {
                if (!graphConfigInfo.graphVariableInfoList[i].Validate())
                {
                    continue;
                }

                resultData.graphVariableInfoList.Add(graphConfigInfo.graphVariableInfoList[i].OnDeserialized());
            }

            //如果有节点无法解析出来(可能是改了类名称之类的),则需要跳过这些节点
            HashSet <int> errorNodeIndexSet = new HashSet <int>();

            //首先将所有的节点都生成
            for (int i = 0; i < graphConfigInfo.nodesList.Count; i++)
            {
                NodeEditorView nodeView = ParseNodeInfo(graphConfigInfo.nodesList[i], graph);
                if (nodeView == null)
                {
                    errorNodeIndexSet.Add(i);
                    continue;
                }

                resultData.nodeList.Add(nodeView);
            }

            //然后再将所有节点的内容写进去,将节点连起来
            int nodeIndex = 0;

            for (int i = 0; i < graphConfigInfo.nodesList.Count; i++)
            {
                if (errorNodeIndexSet.Contains(i))
                {
                    //skip
                    continue;
                }

                UpdateNodeViewData(graphConfigInfo.nodesList[i], resultData.nodeList[nodeIndex], resultData);
                nodeIndex++;
            }

            resultData.graphId          = graphConfigInfo.graphId;
            resultData.graphName        = graphConfigInfo.graphName;
            resultData.graphDescription = graphConfigInfo.graphDescription;

            return(resultData);
        }
Пример #9
0
        public static void SaveGraph(GraphEditorData data)
        {
            string jsonString = String.Empty;

            byte[] runtimeConfigBytes = null;

            bool isSuccess = true;

            try
            {
                //存储技能配置json文件,配置文件使用json是因为可读性好
                GraphConfigInfo graphConfigInfo = new GraphConfigInfo
                {
                    graphId               = data.graphId,
                    graphName             = data.graphName,
                    graphDescription      = data.graphDescription,
                    nodesList             = new List <NodeConfigInfo>(),
                    commentBoxInfoList    = new List <CommentBoxInfo>(),
                    graphVariableInfoList = new List <GraphVariableInfo>(),
                };

                for (int i = 0; i < data.nodeList.Count; i++)
                {
                    NodeEditorView nodeView = data.nodeList[i];

                    graphConfigInfo.nodesList.Add(ConvertToNodeInfo(nodeView));
                }

                for (int i = 0; i < data.commentBoxViewList.Count; i++)
                {
                    CommentBoxView commentBoxView = data.commentBoxViewList[i];
                    graphConfigInfo.commentBoxInfoList.Add(ConvertToCommentInfo(commentBoxView));
                }

                for (int i = 0; i < data.graphVariableInfoList.Count; i++)
                {
                    graphConfigInfo.graphVariableInfoList.Add(data.graphVariableInfoList[i].OnSerialized());
                }

                jsonString         = JsonUtility.ToJson(graphConfigInfo, true);
                runtimeConfigBytes =
                    ConvertToRuntimeInfo(data.nodeList, data.graphVariableInfoList, data.graphId);
            }
            catch (Exception e)
            {
                isSuccess = false;
                Debug.LogError(e.Message);
                throw;
            }
            finally
            {
                if (isSuccess)
                {
                    string graphEditorConfigFilePath = Path.Combine(Application.dataPath,
                                                                    string.Format("FlatNode/Editor/GraphSavedConfig/{0}.json", data.graphId));
                    File.WriteAllText(graphEditorConfigFilePath, jsonString);

                    string graphRuntimeConfigFilePath = Path.Combine(Application.dataPath,
                                                                     string.Format("Resources/GraphRuntime/{0}.bytes", data.graphId));
                    string parentDirctoryPath = Directory.GetParent(graphRuntimeConfigFilePath).FullName;
                    if (!Directory.Exists(parentDirctoryPath))
                    {
                        Directory.CreateDirectory(parentDirctoryPath);
                    }
                    if (runtimeConfigBytes != null)
                    {
                        File.WriteAllBytes(graphRuntimeConfigFilePath, runtimeConfigBytes);
                    }

                    //更新所有图的记录文件
                    AddOrUpdateGraphsRecord(data);

                    AssetDatabase.Refresh();
                }
            }
        }