static ExpressionStatementSyntax BuildLastCallFrameExpression(string instanceId, int recordedValuesCount) { Object graph = null; AbstractNodeAsset asset = EditorUtility.InstanceIDToObject(Convert.ToInt32(instanceId)) as AbstractNodeAsset; if (asset) { graph = asset.Model.GraphModel as GraphModel; } if (graph == null) { return(null); } return(SyntaxFactory.ExpressionStatement( SyntaxFactory.InvocationExpression( SyntaxFactory.MemberAccessExpression( SyntaxKind.SimpleMemberAccessExpression, SyntaxFactory.IdentifierName("Debugger"), SyntaxFactory.IdentifierName("SetLastCallFrame"))) .WithArgumentList( SyntaxFactory.ArgumentList( SyntaxFactory.SeparatedList( new[] { SyntaxFactory.Argument( SyntaxFactory.LiteralExpression( SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(asset.GetInstanceID()))), SyntaxFactory.Argument( SyntaxFactory.LiteralExpression( SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(graph.GetInstanceID()))), SyntaxFactory.Argument( SyntaxFactory.MemberAccessExpression( SyntaxKind.SimpleMemberAccessExpression, SyntaxFactory.IdentifierName("Time"), SyntaxFactory.IdentifierName("frameCount"))), SyntaxFactory.Argument( SyntaxFactory.LiteralExpression( SyntaxKind.StringLiteralExpression, SyntaxFactory.Literal(asset.Model.Title))), SyntaxFactory.Argument( SyntaxFactory.LiteralExpression( SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(recordedValuesCount))), }))))); }
void DrawInspector(AbstractNodeAsset asset, Action onChangedCallback) { if (asset == null) { return; } EditorGUI.BeginChangeCheck(); var obj = new SerializedObject(asset); obj.Update(); var iterator = obj.FindProperty("m_NodeModel"); for (var enterChildren = true; iterator.NextVisible(enterChildren); enterChildren = false) { if (k_ExcludedPropertyNames.Contains(iterator.name)) { continue; } var label = new GUIContent(iterator.displayName); var field = GetFieldViaPath(asset.GetType(), iterator.propertyPath); var typeSearcherAttribute = field?.GetCustomAttribute <TypeSearcherAttribute>(); if (typeSearcherAttribute != null) { TypeReferencePicker(iterator, typeSearcherAttribute, label, onChangedCallback); } else { EditorGUILayout.PropertyField(iterator, label, true); } } obj.ApplyModifiedProperties(); if (EditorGUI.EndChangeCheck()) { onChangedCallback(); } FieldInfo GetFieldViaPath(Type type, string path) { Type parentType = type; FieldInfo fi = type.GetField(path, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); string[] perDot = path.Split('.'); foreach (string fieldName in perDot) { fi = parentType.GetField(fieldName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); if (fi != null) { parentType = fi.FieldType; } else { return(null); } } if (fi != null) { return(fi); } return(null); } }