private static NodeConfigInfo ConvertToNodeInfo(NodeEditorView nodeView) { NodeConfigInfo nodeConfigInfo = new NodeConfigInfo(); nodeConfigInfo.nodeId = nodeView.NodeId; nodeConfigInfo.positionInGraph = nodeView.PositionInGraph; nodeConfigInfo.nodeClassTypeName = nodeView.ReflectionInfo.Type.FullName; nodeConfigInfo.flowOutPortInfoList = new List <FlowOutPortConfigInfo>(); nodeConfigInfo.inputPortInfoList = new List <InputPortConfigInfo>(); //flow out info for (int i = 0; i < nodeView.flowOutPortViews.Length; i++) { FlowOutPortEditorView flowOutPort = nodeView.flowOutPortViews[i]; nodeConfigInfo.flowOutPortInfoList.Add(ConvertToFlowOutPortInfo(flowOutPort)); } //input info for (int i = 0; i < nodeView.inputPortViewList.Count; i++) { InputPortEditorView inputPort = nodeView.inputPortViewList[i]; nodeConfigInfo.inputPortInfoList.Add(ConvertToInputPortInfo(inputPort)); } return(nodeConfigInfo); }
private static FlowOutPortConfigInfo ConvertToFlowOutPortInfo(FlowOutPortEditorView flowOutPort) { FlowOutPortConfigInfo flowOutPortConfigInfo = new FlowOutPortConfigInfo(); flowOutPortConfigInfo.flowOutPortName = flowOutPort.flowoutPortAttribute.portName; flowOutPortConfigInfo.targetNodeList = new List <int>(); for (int i = 0; i < flowOutPort.connectedPortList.Count; i++) { int connectedNodeId = flowOutPort.connectedPortList[i].NodeView.NodeId; flowOutPortConfigInfo.targetNodeList.Add(connectedNodeId); } return(flowOutPortConfigInfo); }
private static Offset <NodeFlowOutPortInfo> ConvertToRuntimeFlowOutPortInfo(FlatBufferBuilder fbb, FlowOutPortEditorView flowOutPort) { List <PortEditorView> connectionPortList = flowOutPort.connectedPortList; int connectionPortCount = connectionPortList.Count; NodeFlowOutPortInfo.StartTargetNodeIdsVector(fbb, connectionPortCount); for (int i = connectionPortCount - 1; i >= 0; i--) { PortEditorView targetPortView = connectionPortList[i]; fbb.AddInt(targetPortView.NodeView.NodeId); } VectorOffset offset = fbb.EndVector(); NodeFlowOutPortInfo.StartNodeFlowOutPortInfo(fbb); NodeFlowOutPortInfo.AddTargetNodeIds(fbb, offset); return(NodeFlowOutPortInfo.EndNodeFlowOutPortInfo(fbb)); }
private static void UpdateNodeViewData(NodeConfigInfo nodeConfigInfo, NodeEditorView nodeView, GraphEditorData data) { //flow in port--处理流出节点的时候顺便就处理了 //flow out port for (int i = 0; i < nodeConfigInfo.flowOutPortInfoList.Count; i++) { FlowOutPortConfigInfo flowOutPortConfigInfo = nodeConfigInfo.flowOutPortInfoList[i]; FlowOutPortEditorView flowOutPortView = GetFlowOutPortViewByPortName(nodeView.flowOutPortViews, flowOutPortConfigInfo.flowOutPortName); if (flowOutPortView == null) { Debug.LogFormat("节点{0}中找不到流出端口 <{1}> 了,该端口的连接被忽略", nodeView.ReflectionInfo.Type, flowOutPortConfigInfo.flowOutPortName); continue; } for (int j = 0; j < flowOutPortConfigInfo.targetNodeList.Count; j++) { int targetNodeId = flowOutPortConfigInfo.targetNodeList[j]; NodeEditorView targetNodeView = data.GetNode(targetNodeId); if (targetNodeView == null) { Debug.LogErrorFormat("无法找到节点{0},可能是配置损坏/更改了类名...", targetNodeId); continue; } if (targetNodeView.flowInPortView == null) { Debug.LogErrorFormat("节点类型{0}没有流入节点,是否节点性质发生了改变?", nodeView.ReflectionInfo.Type.FullName); continue; } ConnectionLineView connectionLineView = new ConnectionLineView(flowOutPortView, targetNodeView.flowInPortView, data); data.connectionLineList.Add(connectionLineView); } } //output port -- 不用配置 //input port for (int i = 0; i < nodeConfigInfo.inputPortInfoList.Count; i++) { InputPortConfigInfo inputPortConfigInfo = nodeConfigInfo.inputPortInfoList[i]; InputPortEditorView inputPortView = GetInputPortViewByPortName(nodeView.inputPortViewList, inputPortConfigInfo.portName); if (inputPortView == null) { Debug.LogFormat("节点{0}中无法找到接口名字为 <{1}> 的NodeInputVariable Field,该接口配置被跳过", nodeView.ReflectionInfo.Type.FullName, inputPortConfigInfo.portName); continue; } //没有连接到其他节点的情况 if (string.IsNullOrEmpty(inputPortConfigInfo.targetPortName)) { //设置默认值 Type valueType = Type.GetType(inputPortConfigInfo.nodeVariableGenericTypeName); if (valueType == null) { valueType = Type.GetType(inputPortConfigInfo.nodeVariableGenericTypeName + ",UnityEngine"); if (valueType == null) { valueType = Type.GetType(inputPortConfigInfo.nodeVariableGenericTypeName + ",Assembly-CSharp"); } } if (valueType == null) { Debug.LogErrorFormat("工程中找不到类型: {0}", inputPortConfigInfo.nodeVariableGenericTypeName); continue; } SetNodeInputVariableValue(inputPortView.inputPortReflectionInfo, valueType, inputPortConfigInfo.nodeVariableValue, nodeView); } //连接到其他节点的情况 else { NodeEditorView connectedToNodeView = data.GetNode(inputPortConfigInfo.targetNodeId); if (connectedToNodeView == null) { Debug.LogErrorFormat("节点 {0} 的input接口 {1} 找不到连接的节点{2}", nodeView.NodeId, inputPortConfigInfo.portName, inputPortConfigInfo.targetNodeId); continue; } OutputPortEditorView connectedToOutputPortView = GetOutputPortViewByPortName(connectedToNodeView.outputPortViewList, inputPortConfigInfo.targetPortName); if (connectedToOutputPortView == null) { Debug.LogFormat("找不到节点{0}中 接口名字为 <{1}> 的output接口,该接口的连接被跳过", connectedToNodeView.NodeId, inputPortConfigInfo.targetPortName); continue; } ConnectionLineView connectionLineView = new ConnectionLineView(inputPortView, connectedToOutputPortView, data); data.connectionLineList.Add(connectionLineView); } } }
public NodeEditorView(Vector2 graphPosition, GraphEditorWindow graph, int nodeId, NodeReflectionInfo reflectionInfo) { this.graph = graph; this.NodeId = nodeId; this.ReflectionInfo = reflectionInfo; PositionInGraph = graphPosition; PositionInWindow = graph.GraphPositionToWindowPosition(graphPosition); viewRect = new Rect(Vector2.zero, new Vector2(200, 400)); allPortList = new List <PortEditorView>(); inputPortViewList = new List <InputPortEditorView>(); outputPortViewList = new List <OutputPortEditorView>(); leftPortLayoutHelper = new PortLayoutHelper(); rightPortLayoutHelper = new PortLayoutHelper(); if (reflectionInfo.HasFlowInPort) { flowInPortView = new FlowInPortEditorView(this); flowInPortView.portId = 0; allPortList.Add(flowInPortView); } if (reflectionInfo.flowOutPortDefineAttributes.Length > 0) { flowOutPortViews = new FlowOutPortEditorView[reflectionInfo.flowOutPortDefineAttributes.Length]; for (int i = 0; i < flowOutPortViews.Length; i++) { flowOutPortViews[i] = new FlowOutPortEditorView(this, reflectionInfo.flowOutPortDefineAttributes[i]); flowOutPortViews[i].portId = i; allPortList.Add(flowOutPortViews[i]); } } else { flowOutPortViews = new FlowOutPortEditorView[0]; } List <InputPortReflectionInfo> inputPortReflectionInfos = reflectionInfo.inputPortInfoList; for (int i = 0; i < inputPortReflectionInfos.Count; i++) { InputPortReflectionInfo inputPortReflectionInfo = inputPortReflectionInfos[i]; InputPortEditorView inputPortView = new InputPortEditorView(this, inputPortReflectionInfo); inputPortView.portId = i; inputPortViewList.Add(inputPortView); allPortList.Add(inputPortView); } List <OutputPortReflectionInfo> outputPortReflectionInfos = reflectionInfo.outputPortInfoList; for (int i = 0; i < outputPortReflectionInfos.Count; i++) { OutputPortReflectionInfo outputPortReflectionInfo = outputPortReflectionInfos[i]; OutputPortEditorView outputPortView = new OutputPortEditorView(this, outputPortReflectionInfo, i); outputPortView.portId = i; outputPortViewList.Add(outputPortView); allPortList.Add(outputPortView); } CalculateNodeSize(); }
public void DrawNodeGUI() { if (graph == null) { return; } PositionInWindow = graph.GraphPositionToWindowPosition(PositionInGraph); viewRect.center = PositionInWindow; if (isSelected) { Rect highLightRect = new Rect(viewRect); highLightRect.position = highLightRect.position - Vector2.one * 2f; highLightRect.max = highLightRect.max + Vector2.one * 4f; GUI.Box(highLightRect, "", Utility.GetGuiStyle("Highlight")); } //draw back ground if (ReflectionInfo.IsEntranceNode) { GUI.Box(viewRect, "", Utility.GetGuiStyle("EntranceNode")); } if (ReflectionInfo.Type.IsSubclassOf(typeof(GraphVariableNodeBase))) { GUI.Box(viewRect, "", Utility.GetGuiStyle("NodeCyan")); } else { GUI.Box(viewRect, "", Utility.GetGuiStyle("NodeBg")); } //draw node name GUI.Label(NodeNameRect, string.Format("({0}){1}", NodeId, ReflectionInfo.NodeName), Utility.GetGuiStyle("NodeName")); leftPortLayoutHelper.SetPosition(new Vector2(viewRect.x, viewRect.y + NodeNameRect.height + PortAreaPadding)); rightPortLayoutHelper.SetPosition(new Vector2(viewRect.x, viewRect.y + NodeNameRect.height + PortAreaPadding)); if (flowInPortView != null) { flowInPortView.portViewRect = leftPortLayoutHelper.GetRect(); } for (int i = 0; i < inputPortViewList.Count; i++) { InputPortEditorView inputPortView = inputPortViewList[i]; inputPortView.portViewRect = leftPortLayoutHelper.GetRect(); } if (flowOutPortViews.Length > 0) { for (int i = 0; i < flowOutPortViews.Length; i++) { FlowOutPortEditorView flowoutPortView = flowOutPortViews[i]; flowoutPortView.portViewRect = rightPortLayoutHelper.GetRect(); } } for (int i = 0; i < outputPortViewList.Count; i++) { OutputPortEditorView outputPortView = outputPortViewList[i]; outputPortView.portViewRect = rightPortLayoutHelper.GetRect(); } for (int i = 0; i < allPortList.Count; i++) { PortEditorView portView = allPortList[i]; portView.Draw(); } }