11 [AddComponentMenu(
"UI/Extensions/Radial Slider")]
12 [RequireComponent(typeof(
Image))]
13 public class RadialSlider : MonoBehaviour, IPointerEnterHandler, IPointerDownHandler, IPointerUpHandler, IDragHandler
15 private bool isPointerDown, isPointerReleased, lerpInProgress;
16 private Vector2 m_localPos, m_screenPos;
17 private float m_targetAngle, m_lerpTargetAngle, m_startAngle, m_currentLerpTime, m_lerpTime;
18 private Camera m_eventCamera;
19 private Image m_image;
22 [Tooltip(
"Radial Gradient Start Color")]
25 [Tooltip(
"Radial Gradient End Color")]
27 [Tooltip(
"Move slider absolute or use Lerping?\nDragging only supported with absolute")]
29 private bool m_lerpToTarget;
30 [Tooltip(
"Curve to apply to the Lerp\nMust be set to enable Lerp")]
32 private AnimationCurve m_lerpCurve;
33 [Tooltip(
"Event fired when value of control changes, outputs an INT angle value")]
36 [Tooltip(
"Event fired when value of control changes, outputs a TEXT angle value")]
47 StartLerp(value / 360f);
51 UpdateRadialImage(value / 360f);
67 UpdateRadialImage(value);
74 get {
return m_endColor; }
75 set { m_endColor = value; }
80 get {
return m_startColor; }
81 set { m_startColor = value; }
86 get {
return m_lerpToTarget; }
87 set { m_lerpToTarget = value; }
92 get {
return m_lerpCurve; }
98 get {
return lerpInProgress; }
112 m_image = GetComponent<Image>();
113 m_image.type =
Image.Type.Filled;
114 m_image.fillMethod =
Image.FillMethod.Radial360;
115 m_image.fillAmount = 0;
123 get {
return _onValueChanged; }
124 set { _onValueChanged = value; }
128 get {
return _onTextValueChanged; }
129 set { _onTextValueChanged = value; }
144 private void Update()
148 m_targetAngle = GetAngleFromMousePoint();
153 UpdateRadialImage(m_targetAngle);
155 NotifyValueChanged();
159 if (isPointerReleased) StartLerp(m_targetAngle);
160 isPointerReleased =
false;
164 if (lerpInProgress &&
Value != m_lerpTargetAngle)
166 m_currentLerpTime += Time.deltaTime;
167 float perc = m_currentLerpTime / m_lerpTime;
170 UpdateRadialImage(Mathf.Lerp(m_startAngle, m_lerpTargetAngle,
LerpCurve.Evaluate(perc)));
174 UpdateRadialImage(Mathf.Lerp(m_startAngle, m_lerpTargetAngle, perc));
177 if (m_currentLerpTime >= m_lerpTime ||
Value == m_lerpTargetAngle)
179 lerpInProgress =
false;
180 UpdateRadialImage(m_lerpTargetAngle);
181 NotifyValueChanged();
185 private void StartLerp(
float targetAngle)
189 m_startAngle =
Value;
190 m_lerpTargetAngle = targetAngle;
191 m_currentLerpTime = 0f;
192 lerpInProgress =
true;
196 private float GetAngleFromMousePoint()
198 RectTransformUtility.ScreenPointToLocalPointInRectangle(transform as RectTransform, m_screenPos, m_eventCamera, out m_localPos);
201 return (Mathf.Atan2(-m_localPos.y, m_localPos.x) * 180f / Mathf.PI + 180f) / 360f;
204 private void UpdateRadialImage(
float targetAngle)
211 private void NotifyValueChanged()
213 _onValueChanged.Invoke((
int)(m_targetAngle * 360f));
214 _onTextValueChanged.Invoke(((
int)(m_targetAngle * 360f)).ToString());
234 m_screenPos = eventData.position;
235 m_eventCamera = eventData.enterEventCamera;
240 m_screenPos = eventData.position;
241 m_eventCamera = eventData.enterEventCamera;
242 isPointerDown =
true;
247 m_screenPos = Vector2.zero;
248 isPointerDown =
false;
249 isPointerReleased =
true;
252 public void OnDrag(PointerEventData eventData)
254 m_screenPos = eventData.position;
System.Drawing.Image Image
void OnPointerDown(PointerEventData eventData)
void OnPointerUp(PointerEventData eventData)
RadialSliderTextValueChangedEvent onTextValueChanged
RadialSliderValueChangedEvent onValueChanged
void OnPointerEnter(PointerEventData eventData)
void OnDrag(PointerEventData eventData)
Credit Erdener Gonenc - @PixelEnvision.