// About the position handle see example https://docs.unity3d.com/ScriptReference/Handles.PositionHandle.html public void OnSceneGUI() { int controlId = GUIUtility.GetControlID(GetHashCode(), FocusType.Passive); Ray ray = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition); RaycastHit hit; if (Physics.Raycast(ray.origin, ray.direction, out hit, Mathf.Infinity)) { mousePos = hit.point; mousePosValid = true; /// /// process mouse & keyboard events /// //if (EditorWindow.focusedWindow) { switch (Event.current.type) { case EventType.KeyDown: { // toggle add mode if (Event.current.shift && Event.current.keyCode == KeyCode.A) { // toggle add mode SplineSettings.AttachMode selectedAttachMode = editorTarget.splineSettings.attachMode; /* * SplineSettings.AttachMode selectedAttachMode = (SplineSettings.AttachMode)System.Enum.GetValues(typeof(SplineSettings.AttachMode)).GetValue(attachMode.enumValueIndex); * * int boundsIndex = ArrayUtility.IndexOf((SplineSettings.AttachMode[])System.Enum.GetValues(typeof(SplineSettings.AttachMode)), SplineSettings.AttachMode.Bounds); * int betweenIndex = ArrayUtility.IndexOf((SplineSettings.AttachMode[])System.Enum.GetValues(typeof(SplineSettings.AttachMode)), SplineSettings.AttachMode.Between); */ if (selectedAttachMode == SplineSettings.AttachMode.Bounds) { editorTarget.splineSettings.attachMode = SplineSettings.AttachMode.Between; } else { editorTarget.splineSettings.attachMode = SplineSettings.AttachMode.Bounds; } // trigger repaint, so that the enumpopup will be updated editor.Repaint(); } ; break; } } } // control key pressed if (Event.current.shift) { mousePos = hit.point; mousePosValid = true; // shift + ctrl = delete bool deleteMode = Event.current.control; int addControlPointIndex = FindClosestControlPoint(mousePos); //Handles.DrawSphere(controlId, mousePos, Quaternion.identity, 0.3f); Color handleColor; if (deleteMode) { handleColor = Color.red; // red = delete } // draw attachment line else { handleColor = Color.gray; // gray = add } // draw gray circle float radius = 0.1f; Handles.color = handleColor; Handles.DrawWireDisc(mousePos, hit.normal, radius); // draw line to closest point if (editorTarget.splineSettings.controlPoints.Count > 0) { // draw indicator line to closest control point Vector3 lineStartPosition = editorTarget.splineSettings.controlPoints.ElementAt(addControlPointIndex).position; Vector3 lineEndPosition = mousePos; Handles.DrawLine(lineStartPosition, lineEndPosition); // draw additional indicator line to the control point which is next in the list after the closest control point if (!deleteMode) { int neighbourIndex; if (addControlPointIndex > 0) { neighbourIndex = addControlPointIndex - 1; } else { neighbourIndex = addControlPointIndex + 1; } if (editorTarget.splineSettings.attachMode == SplineSettings.AttachMode.Between && neighbourIndex >= 0 && neighbourIndex <= editorTarget.splineSettings.controlPoints.Count - 1) { Vector3 neighbourLineStartPosition = editorTarget.splineSettings.controlPoints.ElementAt(neighbourIndex).position; Vector3 neighbourLineEndPosition = mousePos; Handles.DrawLine(neighbourLineStartPosition, neighbourLineEndPosition); } } } if (Event.current.type == EventType.MouseDown) { // delete node if (deleteMode) { bool canDelete = editorTarget.splineSettings.controlPoints.Count > 0; if (Event.current.button == 0 && canDelete) { Vector3 mousePosition = new Vector3(mousePos.x, mousePos.y, mousePos.z); int controlPointIndex = FindClosestControlPoint(mousePosition); // remove the closest point if (controlPointIndex != -1) { RemoveControlPoint(controlPointIndex); } Event.current.Use(); } } // add new node else { // left button = 0; right = 1; middle = 2 if (Event.current.button == 0) { Vector3 position = new Vector3(mousePos.x, mousePos.y, mousePos.z); AddControlPoint(position, addControlPointIndex); Event.current.Use(); } } } } } else { mousePosValid = false; } if (Event.current.type == EventType.Layout) { HandleUtility.AddDefaultControl(controlId); } DrawSplineGizmos(); // create gameobjects bool placeObjects = mousePosValid && spawnMechanism.enumValueIndex == (int)SpawnMechanism.Automatic; if (placeObjects) { PerformEditorAction(); } // show info Handles.BeginGUI(); string[] info = new string[] { "Add Control Point: shift + click", "Remove control point: shift + ctrl + click", "Change Attach Mode: shift + A, Current: " + editorTarget.splineSettings.attachMode }; PrefabPainterEditor.ShowGuiInfo(info); Handles.EndGUI(); }