private static void DrawLimitSlider(SliderJoint2D sliderJoint2D, int limitControlID, Vector2 anchorPosition, Vector2 direction, IEnumerable <Vector2> snapList, Limit limit) { EditorGUI.BeginChangeCheck(); float val; var limits2D = sliderJoint2D.limits; switch (limit) { case Limit.Min: val = limits2D.min; break; case Limit.Max: val = limits2D.max; break; default: throw new ArgumentOutOfRangeException("limit"); } var newLimit = EditorHelpers.LineSlider(limitControlID, anchorPosition, val, Helpers2D.GetAngle(direction), 0.125f, false, limit == Limit.Min); if (!EditorGUI.EndChangeCheck()) { return; } if (snapList != null) { var limitSnapList = new List <Vector2>(snapList); switch (limit) { case Limit.Min: limitSnapList.Add(anchorPosition + direction * limits2D.max); break; case Limit.Max: limitSnapList.Add(anchorPosition + direction * limits2D.min); break; default: throw new ArgumentOutOfRangeException("limit"); } var limitGUIPosition = HandleUtility.WorldToGUIPoint(anchorPosition + direction * newLimit); foreach ( var snapPosition in from snapPosition in limitSnapList let snapGUIPosition = HandleUtility.WorldToGUIPoint(snapPosition) where Vector2.Distance(limitGUIPosition, snapGUIPosition) < 10 select snapPosition) { newLimit = Helpers2D.DistanceAlongLine(new Ray(anchorPosition, direction), snapPosition); } } EditorHelpers.RecordUndo("Change slider limit", sliderJoint2D); switch (limit) { case Limit.Min: limits2D.min = newLimit; break; case Limit.Max: limits2D.max = newLimit; break; default: throw new ArgumentOutOfRangeException("limit"); } sliderJoint2D.limits = limits2D; }