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("#");
  }
}

SliderObject.onValueChanged监听器以long作为参数

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

至于在滑块值变化时将long传递给SetFeedback函数,这是可能的,但完全没有用。这样做的原因是因为Slider组件被设计为在其minValue, maxValuevalue属性中使用浮点数。将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, maxValuevalue属性为long。您可以在Image组件的帮助下实现此功能。

另外,Unity UI是开源的。你也可以从这里获得源代码,复制Slider脚本,命名为BigSlider,然后将所有float变量更改为long