//public void CopyAll<T>(T source, T target) //{ // var type = typeof(T); // foreach (var sourceProperty in type.GetProperties()) // { // var targetProperty = type.GetProperty(sourceProperty.Name); // targetProperty.SetValue(target, sourceProperty.GetValue(source, null), null); // } // foreach (var sourceField in type.GetFields()) // { // var targetField = type.GetField(sourceField.Name); // targetField.SetValue(target, sourceField.GetValue(source)); // } //} // EDITOR Subgraph copy method #if UNITY_EDITOR public Graph CopyEditorSubGraph(Graph _rootGraph, Graph _parentGraph, FlowReactor.Editor.FREditorSettings settings) { Graph _subGraph = Graph.CreateSubGraph("SubGraph", _parentGraph, _rootGraph); _subGraph.isRoot = false; _subGraph.isActive = false; _parentGraph.subGraphs.Add(_subGraph); var _copiedNodes = new List <Node>(); var _selectedNodesList = new List <Node>(nodes); rootGraph.selectedNodes = new Dictionary <int, Node>(); for (int n = 0; n < _selectedNodesList.Count; n++) { SerializationUtility.SerializeValue(_selectedNodesList[n], DataFormat.Binary, out settings.objectReferences); var _original1 = settings.objectReferences[0] as Node; var _newCopy = NodeCreator.CreateNodeFromCopy(_original1.nodeData, _original1, _rootGraph, _subGraph, _original1.nodeData.typeName, 0); _newCopy.outputNodes = new List <Node.NodeOutput>(); _newCopy.inputNodes = new List <Node.InputNode>(); for (int o = 0; o < _original1.outputNodes.Count; o++) { _newCopy.outputNodes.Add(new Node.NodeOutput(_original1.outputNodes[o].outputNode)); _newCopy.outputNodes[_newCopy.outputNodes.Count - 1].guid = _original1.outputNodes[o].guid; } for (int i = 0; i < _original1.inputNodes.Count; i++) { _newCopy.inputNodes.Add(new Node.InputNode(_original1.inputNodes[i].inputNode)); _newCopy.inputNodes[_newCopy.inputNodes.Count - 1].guid = _original1.inputNodes[i].guid; } rootGraph.selectedNodes.Add(_newCopy.GetInstanceID(), _newCopy); _copiedNodes.Add(_newCopy); } // connect in and outputs for (int c = 0; c < _copiedNodes.Count; c++) { _copiedNodes[c].AssignNewOutAndInputsFromList(_copiedNodes); } // Assign new guids for (int n = 0; n < _copiedNodes.Count; n++) { _copiedNodes[n].guid = Guid.NewGuid().ToString(); for (int o = 0; o < _copiedNodes[n].outputNodes.Count; o++) { if (_copiedNodes[n].outputNodes[o].outputNode != null) { for (int i = 0; i < _copiedNodes[n].outputNodes[o].outputNode.inputNodes.Count; i++) { if (_copiedNodes[n].outputNodes[o].outputNode.inputNodes[i].inputNode == _copiedNodes[n]) { _copiedNodes[n].outputNodes[o].outputNode.inputNodes[i].guid = _copiedNodes[n].guid; } } } } for (int o = 0; o < _copiedNodes[n].inputNodes.Count; o++) { for (int i = 0; i < _copiedNodes[n].inputNodes[o].inputNode.outputNodes.Count; i++) { if (_copiedNodes[n].inputNodes[o].inputNode.outputNodes[i].outputNode == _copiedNodes[n]) { _copiedNodes[n].inputNodes[o].inputNode.outputNodes[i].guid = _copiedNodes[n].guid; } } } } for (int h = 0; h < _copiedNodes.Count; h++) { if (_copiedNodes[h].nodeData.nodeType == NodeAttributes.NodeType.SubGraph) { var _subGraphNode = _copiedNodes[h] as SubGraph; var _cs = _subGraphNode.subGraph.CopyEditorSubGraph(_rootGraph, _subGraph, settings); _subGraphNode.subGraph = _cs; _cs.subGraphNode = _subGraphNode; } } return(_subGraph); }