You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

56 lines
2.0 KiB

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<Slider>();
ctrl_slider = transform.Find("ControllingSlider").GetComponent<Slider>();
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<Image>().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)<epsilon?target: smooth + (diff) * Mathf.Min(1.0f, Time.deltaTime / smoothDuration);
if(smooth != slider.value)
slider.value = smooth;
}
}