///Macro Nodes public static UnityEditor.GenericMenu AppendMacroNodesMenu(this FlowGraph graph, UnityEditor.GenericMenu menu, string baseCategory, Vector2 pos, Port sourcePort, object dropInstance) { var projectMacroGUIDS = UnityEditor.AssetDatabase.FindAssets("t:Macro"); foreach (var guid in projectMacroGUIDS) { var path = UnityEditor.AssetDatabase.GUIDToAssetPath(guid); var macro = (Macro)UnityEditor.AssetDatabase.LoadAssetAtPath(path, typeof(Macro)); if (sourcePort is ValueOutput || sourcePort is FlowOutput) { if (!macro.inputDefinitions.Select(d => d.type).Any(d => d.IsAssignableFrom(sourcePort.type))) { continue; } } if (sourcePort is ValueInput || sourcePort is FlowInput) { if (!macro.outputDefinitions.Select(d => d.type).Any(d => sourcePort.type.IsAssignableFrom(d))) { continue; } } var category = baseCategory + (!string.IsNullOrEmpty(macro.category) ? "/" + macro.category : ""); var name = category + "/" + macro.name; var content = new GUIContent(name, null, macro.comments); if (macro != graph) { menu.AddItem(content, false, () => { graph.AddMacroNode(macro, pos, sourcePort, dropInstance); }); } else { menu.AddDisabledItem(content); } } if (sourcePort == null) { menu.AddItem(new GUIContent("MACROS/Create New...", null, "Create a new macro"), false, () => { var newMacro = EditorUtils.CreateAsset <Macro>(); if (newMacro != null) { var wrapper = graph.AddNode <MacroNodeWrapper>(pos); wrapper.macro = newMacro; } }); } return(menu); }