SliderObject.onValueChanged侦听器将long作为参数

时间:2016-09-04 04:56:04

标签: c# unity3d listener

我需要用户通过滑块传递long。但是我无法添加一个将float作为参数作为滑块侦听器的函数。请参阅“活动”下的this

浮动导致精度损失问题。我该如何解决这个问题?

我目前使用的脚本与此类似。监听器函数采用using UnityEngine; using System.Collections; using UnityEngine.UI; using UnityEngine.Events; public class SliderMessageBox : MonoBehaviour { public Slider SliderObject; public Text SliderFeedback; public void Function(long MaximumValue) { SliderObject.minValue = 1000; SliderObject.maxValue = MaximumValue; SliderObject.onValueChanged.AddListener(SetFeedback); SetFeedback(SliderObject.value); } void SetFeedback(float value) { SliderFeedback.text = value.ToString("#"); } }

if isFingerOnPaddle

1 个答案:

答案 0 :(得分:1)

每次点击SliderObject.onValueChanged.AddListener(SetFeedback);时,您都不会致电Button。您应该调用该函数一次,以注册滑块值更改事件。该行代码应移至Start()函数。

当滑块值更改时,将long传递给SetFeedback函数,即可能但完全没用。这是因为Slider组件旨在与其minValuemaxValuevalue属性中的浮点数一起使用。将long分配给这些属性不会解决您的精度问题。

如果您仍想这样做,可以使用delegate和强制转换来实现此目的:

public Slider SliderObject;
public Text SliderFeedback;

void Start()
{
    SliderObject.onValueChanged.AddListener(delegate { SetFeedback((long)SliderObject.value); });
}

public void Function(long MaximumValue)
{
    SliderObject.minValue = 1000;
    SliderObject.maxValue = MaximumValue;
    SetFeedback((long)SliderObject.value);
}

void SetFeedback(long value)
{
    SliderFeedback.text = value.ToString();
}

应该编译,但解决问题的正确方法是实现自己的自定义Slider组件,并将其minValuemaxValuevalue属性设为{ {1}}。您可以在long组件的帮助下实现此功能。

此外,Unity UI是开源的。您还可以从here获取源代码,复制Slider脚本,将其命名为Image,然后将所有BigSlider变量更改为float