void OnGUI() { //scrollPos = EditorGUILayout.BeginScrollView(scrollPos,true, true); if (editor == null) { editor = EditorWindow.GetWindow <NodeEditor>(); } Event e = Event.current; mousePos = e.mousePosition; if (e.button == 1 && !makeTransitionMode) { if (e.type == EventType.MouseDown) { bool clickedOnWindow = false; BaseNode tempSelectedNode = null; foreach (BaseNode node in nodes) { if (node.windowRect.Contains(mousePos)) { tempSelectedNode = node; clickedOnWindow = true; break; } } if (!clickedOnWindow) { GenericMenu menu = new GenericMenu(); menu.AddItem(new GUIContent("Add Noise Node"), false, ContextCallback, "noiseNode"); menu.AddItem(new GUIContent("Add Output Node"), false, ContextCallback, "outputNode"); menu.AddItem(new GUIContent("Add Calculation Node"), false, ContextCallback, "calculationNode"); menu.AddItem(new GUIContent("Add Wave Node"), false, ContextCallback, "waveNode"); menu.ShowAsContext(); e.Use(); } else { GenericMenu menu = new GenericMenu(); if (tempSelectedNode.GetType() != typeof(OutputNode)) { menu.AddItem(new GUIContent("Make Transition"), false, ContextCallback, "makeTransition"); } if (tempSelectedNode.GetType() == typeof(NoiseNode)) { menu.AddItem(new GUIContent("Call Method"), false, ContextCallback, "callMethod"); } menu.AddSeparator(""); menu.AddItem(new GUIContent("Delete Node"), false, ContextCallback, "deleteNode"); menu.ShowAsContext(); e.Use(); } } } else if (e.button == 0 && e.type == EventType.MouseDown && makeTransitionMode) { bool clickedOnWindow = false; BaseNode tempSelectedNode = null; foreach (BaseNode node in nodes) { if (node.windowRect.Contains(mousePos)) { tempSelectedNode = node; clickedOnWindow = true; break; } } if (clickedOnWindow && !tempSelectedNode.Equals(selectedNode)) { tempSelectedNode.SetInput((BaseInputNode)selectedNode, mousePos); makeTransitionMode = false; selectedNode = null; } if (!clickedOnWindow) { makeTransitionMode = false; selectedNode = null; } } else if (e.button == 0 && e.type == EventType.MouseDown && !makeTransitionMode) { bool clickedOnWindow = false; BaseNode tempSelectedNode = null; foreach (BaseNode node in nodes) { if (node.windowRect.Contains(mousePos)) { tempSelectedNode = node; clickedOnWindow = true; break; } } if (clickedOnWindow) { BaseInputNode nodeToChange = tempSelectedNode.ClickedOnInput(mousePos); if (nodeToChange != null) { makeTransitionMode = true; selectedNode = nodeToChange; } } } if (makeTransitionMode && selectedNode != null) { Rect mouseRect = new Rect(mousePos.x, mousePos.y, 10, 10); DrawNodeCurve(selectedNode.outputRect, mouseRect); Repaint(); } for (int i = nodes.Count - 1; i >= 0; i--) { if (nodes[i] == null) { nodes.Remove(nodes[i]); } } foreach (BaseNode n in nodes) { if (n != null) { n.DrawCurves(); } } scrollPos = GUI.BeginScrollView(new Rect(0, 0, position.width, position.height), scrollPos, new Rect(0, 0, 1000, 1000)); BeginWindows(); for (int i = 0; i < nodes.Count; i++) { nodes[i].windowRect = GUILayout.Window(i, nodes[i].windowRect, DrawNodeWindow, nodes[i].windowTitle); nodes[i].id = i; } EndWindows(); GUI.EndScrollView(); }