8 [AddComponentMenu(
"UI/BoxSlider", 35)]
9 [RequireComponent(typeof(RectTransform))]
10 public class BoxSlider : Selectable, IDragHandler, IInitializePotentialDragHandler, ICanvasElement
25 [SerializeField]
private RectTransform m_HandleRect;
32 if (SetClass(ref m_HandleRect,
value))
34 UpdateCachedReferences();
40 [Space(6)] [SerializeField]
private float m_MinValue;
47 if (SetStruct(ref m_MinValue,
value))
56 [SerializeField]
private float m_MaxValue = 1;
63 if (SetStruct(ref m_MaxValue,
value))
72 [SerializeField]
private bool m_WholeNumbers;
76 get => m_WholeNumbers;
79 if (SetStruct(ref m_WholeNumbers,
value))
88 [SerializeField]
private float m_Value = 1f;
95 return Mathf.Round(m_Value);
112 [SerializeField]
private float m_ValueY = 1f;
119 return Mathf.Round(m_ValueY);
140 private BoxSliderEvent m_OnValueChanged =
new BoxSliderEvent();
144 get => m_OnValueChanged;
145 set => m_OnValueChanged =
value;
153 private Transform m_HandleTransform;
154 private RectTransform m_HandleContainerRect;
157 private Vector2 m_Offset = Vector2.zero;
159 private DrivenRectTransformTracker m_Tracker;
169 protected override void OnValidate()
175 m_MinValue = Mathf.Round(m_MinValue);
176 m_MaxValue = Mathf.Round(m_MaxValue);
182 UpdateCachedReferences();
184 SetY(m_ValueY,
false);
189#if UNITY_2018_3_OR_NEWER
191 if (!PrefabUtility.IsPartOfPrefabAsset(
this) && !Application.isPlaying)
192 CanvasUpdateRegistry.RegisterCanvasElementForLayoutRebuild(
this);
195 var prefabType =
UnityEditor.PrefabUtility.GetPrefabType(
this);
196 if (prefabType !=
UnityEditor.PrefabType.Prefab && !Application.isPlaying)
197 CanvasUpdateRegistry.RegisterCanvasElementForLayoutRebuild(
this);
202 public virtual void Rebuild(CanvasUpdate executing)
205 if (executing == CanvasUpdate.Prelayout)
218 public static bool SetClass<T>(ref T currentValue, T newValue) where T :
class
220 if (currentValue ==
null && newValue ==
null || currentValue !=
null && currentValue.Equals(newValue))
223 currentValue = newValue;
227 public static bool SetStruct<T>(ref T currentValue, T newValue) where T :
struct
229 if (currentValue.Equals(newValue))
232 currentValue = newValue;
239 UpdateCachedReferences();
241 SetY(m_ValueY,
false);
252 void UpdateCachedReferences()
256 m_HandleTransform = m_HandleRect.transform;
257 if (m_HandleTransform.parent !=
null)
258 m_HandleContainerRect = m_HandleTransform.parent.GetComponent<RectTransform>();
262 m_HandleContainerRect =
null;
267 void Set(
float input)
272 void Set(
float input,
bool sendCallback)
277 newValue = Mathf.Round(newValue);
280 if (m_Value.Equals(newValue))
286 m_OnValueChanged.Invoke(newValue,
valueY);
289 void SetY(
float input)
294 void SetY(
float input,
bool sendCallback)
299 newValue = Mathf.Round(newValue);
302 if (m_ValueY.Equals(newValue))
308 m_OnValueChanged.Invoke(
value, newValue);
314 base.OnRectTransformDimensionsChange();
326 private void UpdateVisuals()
329 if (!Application.isPlaying)
330 UpdateCachedReferences();
337 if (m_HandleContainerRect !=
null)
339 m_Tracker.Add(
this, m_HandleRect, DrivenTransformProperties.Anchors);
340 var anchorMin = Vector2.zero;
341 var anchorMax = Vector2.one;
345 m_HandleRect.anchorMin = anchorMin;
346 m_HandleRect.anchorMax = anchorMax;
351 void UpdateDrag(PointerEventData eventData, Camera cam)
353 var clickRect = m_HandleContainerRect;
354 if (clickRect !=
null && clickRect.rect.size[0] > 0)
357 if (!RectTransformUtility.ScreenPointToLocalPointInRectangle(clickRect, eventData.position, cam,
360 localCursor -= clickRect.rect.position;
362 var val = Mathf.Clamp01((localCursor - m_Offset)[0] / clickRect.rect.size[0]);
365 var valY = Mathf.Clamp01((localCursor - m_Offset)[1] / clickRect.rect.size[1]);
370 private bool MayDrag(PointerEventData eventData)
372 return IsActive() && IsInteractable() && eventData.button == PointerEventData.InputButton.Left;
377 if (!MayDrag(eventData))
380 base.OnPointerDown(eventData);
382 m_Offset = Vector2.zero;
383 if (m_HandleContainerRect !=
null &&
384 RectTransformUtility.RectangleContainsScreenPoint(m_HandleRect, eventData.position,
385 eventData.enterEventCamera))
387 Vector2 localMousePos;
388 if (RectTransformUtility.ScreenPointToLocalPointInRectangle(m_HandleRect, eventData.position,
389 eventData.pressEventCamera, out localMousePos))
390 m_Offset = localMousePos;
391 m_Offset.y = -m_Offset.y;
396 UpdateDrag(eventData, eventData.pressEventCamera);
400 public virtual void OnDrag(PointerEventData eventData)
402 if (!MayDrag(eventData))
405 UpdateDrag(eventData, eventData.pressEventCamera);
483 eventData.useDragThreshold =
false;
static bool SetStruct< T >(ref T currentValue, T newValue)
override void OnRectTransformDimensionsChange()
override void OnDisable()
BoxSliderEvent onValueChanged
override void OnPointerDown(PointerEventData eventData)
void GraphicUpdateComplete()
static bool SetClass< T >(ref T currentValue, T newValue)
virtual void Rebuild(CanvasUpdate executing)
virtual void OnDrag(PointerEventData eventData)
virtual void OnInitializePotentialDrag(PointerEventData eventData)