using UnityEngine; using UnityEngine.UI; public class QuantizedSlider : MonoBehaviour { public float epsilon = 0.01f; public float step = 1.0f; public float smoothDuration = 0.2f; private Slider slider; private Slider ctrl_slider; private float smooth; private float target; void copyTransform(GameObject dst, GameObject src) { RectTransform srcRect = src.transform as RectTransform; RectTransform dstRect = dst.transform as RectTransform; dstRect.anchorMin = srcRect.anchorMin; dstRect.anchorMax = srcRect.anchorMax; dstRect.sizeDelta = srcRect.sizeDelta; dstRect.anchoredPosition = srcRect.anchoredPosition; } // Use this for initialization void Start () { slider = GetComponent(); ctrl_slider = transform.Find("ControllingSlider").GetComponent(); ctrl_slider.value = smooth = target = slider.value; ctrl_slider.minValue = slider.minValue; ctrl_slider.maxValue = slider.maxValue; ctrl_slider.onValueChanged.AddListener(OnValueChange); ctrl_slider.transform.hideFlags = HideFlags.NotEditable; GameObject handle = Instantiate(slider.handleRect.gameObject, slider.handleRect.parent); copyTransform(handle, slider.handleRect.gameObject); ctrl_slider.handleRect = handle.transform as RectTransform; handle.GetComponent().color = new Color(1.0f, 0.0f, 0.0f, 0.0f); handle.transform.hideFlags = HideFlags.NotEditable; } void OnValueChange(float f) { target = Mathf.Round((ctrl_slider.value - slider.minValue) / step)*step; target = Mathf.Clamp(target, slider.minValue, slider.maxValue); } // Update is called once per frame void Update () { float diff = target - smooth; smooth = Mathf.Abs(diff)