protected virtual void OnGUI() { bool hasClickedOnNode = false; int selectIndex = -1; Event e = Event.current; m_mousePos = e.mousePosition; for (int i = 0; i < m_nodes.Count; ++i) { if (m_nodes[i].nodeRect.Contains(m_mousePos)) { selectIndex = i; hasClickedOnNode = true; break; } } if (e.button == 1 && !canMakeTransition) { if (e.type == EventType.MouseDown) { GenerateGenericMenu(hasClickedOnNode); e.Use(); } } else if (e.button == 0 && e.type == EventType.MouseDown && canMakeTransition) { if (hasClickedOnNode && !m_nodes[selectIndex].Equals(m_selectedNode)) { m_nodes[selectIndex].SetInput(m_selectedNode, m_mousePos); } canMakeTransition = false; m_selectedNode = null; e.Use(); } else if (e.button == 0 && e.type == EventType.MouseDown && !canMakeTransition) { if (hasClickedOnNode) { BaseNode nodeToChange = m_nodes[selectIndex]; if (nodeToChange != null) { m_selectedNode = nodeToChange; canMakeTransition = m_selectedNode.CanMakeTransition(); } } } if (canMakeTransition && m_selectedNode != null) { Rect mouseRect = new Rect(e.mousePosition.x, e.mousePosition.y, 10, 10); DrawNodeTransitionLine(m_selectedNode.nodeRect, mouseRect); Repaint(); } foreach (BaseNode node in m_nodes) { node.DrawTransitions(); } BeginWindows(); for (int i = 0; i < m_nodes.Count; ++i) { // Definig background color for the node GUI.color = (m_nodes[i] == m_entryPoint) ? Color.green : new Color(193, 123, 193); m_nodes[i].nodeRect = GUI.Window(i, m_nodes[i].nodeRect, DrawNodeWindow, m_nodes[i].nodeName); } EndWindows(); GUI.color = new Color(193, 123, 193); if (GUILayout.Button("Export StateMachine")) { ExportJSON(); } }