美文网首页
Unity中,允许用户通过滑动条或输入值的方式设置参数值

Unity中,允许用户通过滑动条或输入值的方式设置参数值

作者: 全新的饭 | 来源:发表于2022-05-09 18:10 被阅读0次

需求

游戏中的某项参数,允许玩家自行配置。
提供2种配置方式:滑动条、直接输入。
参数值是有限制范围的(最小最大值)。

示意如下:最小值0.1,最大值10,限制位数为小数点后2位。


在游戏内调整参数值.gif

思路

当玩家通过前述任一一种方式设置值时,需同时修改滑动条(scrollBar)、输入框(inputField)对应的值。

实现

制作一个GameObject,其层级结构如下图


image.png

ConfigParamInputCtr.cs
在Init中传入:最小值、最大值、初始值、限制位数到小数点后几位(至少是0位,即该参数为整数)。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

/// <summary>
/// 输入配置参数控制:ScrollBar+InputField
/// </summary>
public class ConfigParamInputCtr : MonoBehaviour
{
    [SerializeField]
    private Scrollbar _scrollBar;
    [SerializeField]
    private InputField _inputField;

    private float _cur;
    public float Value
    {
        get { return _cur; }
    }

    private float Min{ get; set; }
    private float Max{ get; set; }
    public int DecimalPlaceCnt{ get; set; }

    /*
    // 测试
    private void Start() 
    {
        Init(1, 10, 3, 0);
    }
    */

    private void OnDestroy()
    {
        Destroy();
    }
    
    public void Init(float min, float max, float cur, int decimalPlaceCnt = 2)
    {
        Min = min;
        Max = max;
        DecimalPlaceCnt = decimalPlaceCnt;
        SetValue(cur);

        _scrollBar.onValueChanged.AddListener(OnScrollBarValueChanged);
        _inputField.onEndEdit.AddListener(OnInputFieldEndEdit);
        _inputField.contentType = InputField.ContentType.DecimalNumber;
    }
    
    public void Destroy()
    {
        _scrollBar.onValueChanged.RemoveListener(OnScrollBarValueChanged);
        _inputField.onEndEdit.RemoveListener(OnInputFieldEndEdit);
    }

    private void OnScrollBarValueChanged(float value)
    {
        SetValue(Min + (Max - Min) * value);
    }
    private void OnInputFieldEndEdit(string value)
    {
        if (float.TryParse(value, out float v))
        {
            SetValue(v);
        }
    }

    public void SetValue(float value)
    {
        int factor = (int)(Mathf.Pow(10, DecimalPlaceCnt));
        value = (int)(value * factor) / (float)factor;
        _cur = Mathf.Clamp(value, Min, Max);

        _scrollBar.SetValueWithoutNotify((Value - Min) / (Max - Min));
        _inputField.SetTextWithoutNotify(Value.ToString());
    }
}

相关文章

网友评论

      本文标题:Unity中,允许用户通过滑动条或输入值的方式设置参数值

      本文链接:https://www.haomeiwen.com/subject/psnhurtx.html