private bool TrySetupNode(UdonNodeDefinition udonNodeDefinition, Vector2?position, out UdonNode node, ref UdonNodeData nodeData) { DoPropHack(); if (!TryCreateNodeInstance(out node)) { return(false); } if (nodeData == null) { nodeData = data.AddNode(udonNodeDefinition.fullName); } node.uid = nodeData.uid; return(true); void DoPropHack() { //Awful hack to fix regression in unity graph property type conversion { FieldInfo prop = typeof(TypeConverter).GetField( "useCompatibleTypeConversion", BindingFlags.NonPublic | BindingFlags.Static ); if (prop != null) { prop.SetValue(this, true); } } } bool TryCreateNodeInstance(out UdonNode outNode) { outNode = CreateInstance <UdonNode>(); outNode.name = udonNodeDefinition.fullName; outNode.title = PrettyString(udonNodeDefinition.name).FriendlyNameify(); outNode.position = position == null ? new Rect(Vector2.zero, Vector2.zero) : new Rect(position.Value, Vector2.zero); string nodeName = outNode.name; if (nodeName.StartsWith("Event_") && (nodeName != "Event_Custom" || graphProgramAsset.GetType() == typeof(UdonSubGraphAsset))) { if (nodes.Any(n => n.name == nodeName)) { Debug.LogWarning( $"Can't create more than one {nodeName} node, try managing your flow with a Block node instead!"); return(false); } } if (nodeName.StartsWith("Event_") && (nodeName != "Event_Custom" && graphProgramAsset.GetType() == typeof(UdonSubGraphAsset))) { Debug.LogWarning($"SubGraphs can't use built-in events, pipe in your event from the parent graph instead!"); return(false); } if (outNode.title == "Const_VRCUdonCommonInterfacesIUdonEventReceiver") { outNode.title = "UdonBehaviour"; } return(true); } }
public void ReSerializeData() { if (Reloading) { return; } SerializedObject serializedGraphProgramAsset; if (graphProgramAsset.GetType() == typeof(UdonGraphProgramAsset)) { serializedGraphProgramAsset = new SerializedObject((UdonGraphProgramAsset)graphProgramAsset); } else { serializedGraphProgramAsset = new SerializedObject((UdonSubGraphAsset)graphProgramAsset); } SerializedProperty graphDataProperty = serializedGraphProgramAsset.FindProperty("graphData"); SerializedProperty nodesProperty = graphDataProperty.FindPropertyRelative("nodes"); if (nodesProperty.arraySize > data.nodes.Count) { nodesProperty.ClearArray(); } for (int i = 0; i < data.nodes.Count; i++) { if (nodesProperty.arraySize < data.nodes.Count) { nodesProperty.InsertArrayElementAtIndex(i); } SerializedProperty nodeProperty = nodesProperty.GetArrayElementAtIndex(i); SerializedProperty fullNameProperty = nodeProperty.FindPropertyRelative("fullName"); fullNameProperty.stringValue = data.nodes[i].fullName; SerializedProperty uidProperty = nodeProperty.FindPropertyRelative("uid"); uidProperty.stringValue = data.nodes[i].uid; SerializedProperty positionProperty = nodeProperty.FindPropertyRelative("position"); positionProperty.vector2Value = data.nodes[i].position; SerializedProperty nodeUIDsProperty = nodeProperty.FindPropertyRelative("nodeUIDs"); while (nodeUIDsProperty.arraySize > data.nodes[i].nodeUIDs.Length) { nodeUIDsProperty.DeleteArrayElementAtIndex(nodeUIDsProperty.arraySize - 1); } for (int j = 0; j < data.nodes[i].nodeUIDs.Length; j++) { if (nodeUIDsProperty.arraySize < data.nodes[i].nodeUIDs.Length) { nodeUIDsProperty.InsertArrayElementAtIndex(j); nodeUIDsProperty.GetArrayElementAtIndex(j).stringValue = ""; } SerializedProperty nodeUIDProperty = nodeUIDsProperty.GetArrayElementAtIndex(j); nodeUIDProperty.stringValue = data.nodes[i].nodeUIDs[j]; } SerializedProperty flowUIDsProperty = nodeProperty.FindPropertyRelative("flowUIDs"); while (flowUIDsProperty.arraySize > data.nodes[i].flowUIDs.Length) { flowUIDsProperty.DeleteArrayElementAtIndex(flowUIDsProperty.arraySize - 1); } for (int j = 0; j < data.nodes[i].flowUIDs.Length; j++) { if (flowUIDsProperty.arraySize < data.nodes[i].flowUIDs.Length) { flowUIDsProperty.InsertArrayElementAtIndex(j); flowUIDsProperty.GetArrayElementAtIndex(j).stringValue = ""; } SerializedProperty flowUIDProperty = flowUIDsProperty.GetArrayElementAtIndex(j); flowUIDProperty.stringValue = data.nodes[i].flowUIDs[j]; } SerializedProperty nodeValuesProperty = nodeProperty.FindPropertyRelative("nodeValues"); while (nodeValuesProperty.arraySize > data.nodes[i].nodeValues.Length) { nodeValuesProperty.DeleteArrayElementAtIndex(nodeValuesProperty.arraySize - 1); } for (int j = 0; j < data.nodes[i].nodeValues.Length; j++) { if (nodeValuesProperty.arraySize < data.nodes[i].nodeValues.Length) { nodeValuesProperty.InsertArrayElementAtIndex(j); nodeValuesProperty.GetArrayElementAtIndex(j).FindPropertyRelative("unityObjectValue").objectReferenceValue = null; nodeValuesProperty.GetArrayElementAtIndex(j).FindPropertyRelative("stringValue").stringValue = ""; } SerializedProperty nodeValueProperty = nodeValuesProperty.GetArrayElementAtIndex(j); if (data.nodes[i].nodeValues[j] == null) { continue; } object nodeValue = data.nodes[i].nodeValues[j].Deserialize(); if (nodeValue != null) { if (nodeValue is UnityEngine.Object value) { if (value != null) { nodeValueProperty.FindPropertyRelative("unityObjectValue").objectReferenceValue = data.nodes[i].nodeValues[j].unityObjectValue; } } } nodeValueProperty.FindPropertyRelative("stringValue").stringValue = data.nodes[i].nodeValues[j].stringValue; } } serializedGraphProgramAsset.ApplyModifiedProperties(); if (graphProgramAsset is AbstractUdonProgramSource udonProgramSource) { UdonEditorManager.Instance.QueueProgramSourceRefresh(udonProgramSource); } }