需求
游戏中的某项参数,允许玩家自行配置。
提供2种配置方式:滑动条、直接输入。
参数值是有限制范围的(最小最大值)。
示意如下:最小值0.1,最大值10,限制位数为小数点后2位。

思路
当玩家通过前述任一一种方式设置值时,需同时修改滑动条(scrollBar)、输入框(inputField)对应的值。
实现
制作一个GameObject,其层级结构如下图

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());
}
}
网友评论