SliderObject.onValueChanged监听器以long作为参数
本文关键字:参数 long onValueChanged 监听器 SliderObject | 更新日期: 2023-09-27 18:05:28
我需要用户通过滑块传递long
。然而,我不能添加一个函数,将long
作为参数作为滑块的侦听器。
float会导致精度损失问题。我该如何解决这个问题?
我目前使用的脚本类似于此。监听器函数接受一个float
:
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("#");
}
}
每次单击Button
时都不调用SliderObject.onValueChanged.AddListener(SetFeedback);
。您应该调用函数一次,以注册到滑块值更改事件。这行代码应该移到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
属性为long
。您可以在Image
组件的帮助下实现此功能。
另外,Unity UI是开源的。你也可以从这里获得源代码,复制Slider脚本,命名为BigSlider
,然后将所有float
变量更改为long
。