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
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;
|
|
|
|
}
|
|
}
|
|
|