【问题标题】:Use Slider to set variable value, without touching the Slider first使用 Slider 设置变量值,无需先触摸 Slider
【发布时间】:2020-07-01 19:53:02
【问题描述】:

我有一个附加到文本游戏对象的简短脚本,它设置文本以显示滑块的当前值/位置。此文本游戏对象附加到值更改字段上的滑块:ShowSliderValue -> [Dynamic float] TextUpdate

当我按下播放时,我的文本不会立即显示所选值/位置。仅当我更改滑块的位置时,文本才会从“新文本”更改为滑块的实际值。 从技术上讲,当我按下播放时,我想触发“On Value Changed”。这样我可以避免脚本中任何不必要的依赖。

using UnityEngine;
using UnityEngine.UI;

public class ShowSliderValue : MonoBehaviour
{
    private Text text;

    void Awake()
    {
        text = this.GetComponent<Text>();
    }

    public void TextUpdate(float value)
    {
        text.text = value.ToString("0.00");
    }
}

在寻找解决方案时,我发现了以下视频。在 5:06(到 5:26),他们将默认值设置为 1 到 30,而且它似乎开箱即用。 Click here for youtube link.

我的文本是否可以在不先移动滑块或在显示的脚本中主动询问滑块值的情况下显示滑块值?

编辑:

这是我目前的解决方案: 我向我的 Slider 添加了一个脚本,该脚本更改了 Start() 上的 Slider 值。由于值需要实际改变,所以 slider.value = slider.value 不起作用。

using UnityEngine;
using UnityEngine.UI;


public class SliderTest : MonoBehaviour
{
    private void Start()
    {
        Slider slider = this.GetComponent<Slider>();

        float originalValue = slider.value;

        slider.value = slider.maxValue;
        slider.value = slider.minValue;

        slider.value = originalValue;
    }
}

这可确保发生值更改。除非 minValue = maxValue - 无论如何都会使滑块过时。

【问题讨论】:

    标签: c# unity3d user-interface slider


    【解决方案1】:

    您可以使用此脚本在第一帧设置滑块的文本,之后您可以使用 Textupdate 函数设置文本值。 这是我制作的脚本:

    
    using UnityEngine;
    using UnityEngine.UI;
    using TMPro;
    
    public class SliderTutorial : MonoBehaviour
    {
        public Slider slider;
        public TextMeshProUGUI txt;
    
        // Start is called before the first frame update
        void Start()
        {
            SetText();
        }
    
        public void SetText()
        {
            txt.SetText(slider.value.ToString());
        }
        public void TextUpdate(float value)
        {
            txt.SetText(value.ToString());
        }
    }
    

    您也可以使用这样的东西,它会不断更新脚本本身的文本,而不是 On Value Changed 事件。

    using UnityEngine;
    using UnityEngine.UI;
    using TMPro;
    
    public class SliderTutorial : MonoBehaviour
    {
        public Slider slider;
        public TextMeshProUGUI txt;
    
        // Update is called once per frame
        void Update()
        {
            txt.SetText(slider.value.ToString());
        }
    }
    

    如果您还有其他问题,请随时提出。

    【讨论】:

    • 感谢您的建议。 Saldy 这两种选择都不完全是我想要的。就像我试图在我的问题中解释的那样:我的脚本由值更改字段上的滑块提供。所以我的文本游戏对象不依赖于滑块的存在。这意味着信息正在从滑块“发送”到文本。没有任何向后依赖(例如,我的文本要求滑块值)。所以最简单的方法是如果我可以手动触发 On Value Changed-Field。
    • 此外,使用 [SerializeField] 私有 (...) 始终是一个好习惯,如果是公共 (...) 则使用 insead :)
    • 我不知道这种情况下的任何解决方案。你真的有必要通过脚本获取滑块的值吗? (公共变量只是为了使代码更清晰,但感谢提示 xD)
    猜你喜欢
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 2012-01-12
    • 2016-03-31
    • 1970-01-01
    • 2012-07-11
    相关资源
    最近更新 更多