using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; // Scene视图中的自定义handles public static class EditorHandlesHelper { static int s_ValueScaleHandleHash; // limit value 数据 static float s_StartScale; static float s_ValueDrag; static float s_ScaleDrawLength; static EditorHandlesHelper() { s_ValueScaleHandleHash = "ValueScaleHandleHash".GetHashCode(); } #region 单一handle // 控制数值的handle public static float ScaleValueHandle(float value, Vector3 position, Quaternion rotation, float size, Handles.CapFunction capFunc, float snap) { int controlID = GUIUtility.GetControlID(s_ValueScaleHandleHash, FocusType.Keyboard); int id = controlID; Event current = Event.current; switch (current.GetTypeForControl(id)) { case EventType.MouseDown: if ((HandleUtility.nearestControl == id && current.button == 0) || (GUIUtility.keyboardControl == id && current.button == 2)) { GUIUtility.keyboardControl = id; GUIUtility.hotControl = id; s_StartScale = value; s_ValueDrag = 0f; current.Use(); EditorGUIUtility.SetWantsMouseJumping(1); } break; case EventType.MouseUp: if (GUIUtility.hotControl == id && (current.button == 0 || current.button == 2)) { GUIUtility.hotControl = 0; s_ScaleDrawLength = 1f; current.Use(); EditorGUIUtility.SetWantsMouseJumping(0); } break; case EventType.MouseDrag: if (GUIUtility.hotControl == id) { s_ValueDrag += HandleUtility.niceMouseDelta * 0.01f; value = (Handles.SnapValue(s_ValueDrag, snap) + 1f) * s_StartScale; s_ScaleDrawLength = value / s_StartScale; GUI.changed = true; current.Use(); } break; case EventType.KeyDown: if (GUIUtility.hotControl == id && current.keyCode == KeyCode.Escape) { value = s_StartScale; s_ScaleDrawLength = 1f; GUIUtility.hotControl = 0; GUI.changed = true; current.Use(); } break; case EventType.Repaint: { Color color = Color.white; if (id == GUIUtility.keyboardControl) { color = Handles.color; Handles.color = Handles.selectedColor; } capFunc(id, position, rotation, size * 0.15f, EventType.Repaint); if (id == GUIUtility.keyboardControl) { Handles.color = color; } break; } case EventType.Layout: HandleUtility.AddControl(id, HandleUtility.DistanceToCircle(position, size * 0.15f)); break; } return value; } #endregion #region 复合handle #endregion }