我需要用户通过滑块传递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
答案 0 :(得分:1)
每次点击SliderObject.onValueChanged.AddListener(SetFeedback);
时,您都不会致电Button
。您应该调用该函数一次,以注册滑块值更改事件。该行代码应移至Start()
函数。
当滑块值更改时,将long
传递给SetFeedback
函数,即可能但完全没用。这是因为Slider
组件旨在与其minValue
,maxValue
和value
属性中的浮点数一起使用。将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
组件,并将其minValue
,maxValue
和value
属性设为{ {1}}。您可以在long
组件的帮助下实现此功能。
此外,Unity UI是开源的。您还可以从here获取源代码,复制Slider脚本,将其命名为Image
,然后将所有BigSlider
变量更改为float
。