UI系统组件
This commit is contained in:
52
Assets/_Game/Scripts/UI/Controls/UISlider.cs
Normal file
52
Assets/_Game/Scripts/UI/Controls/UISlider.cs
Normal file
@@ -0,0 +1,52 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using UnityEngine.Events;
|
||||
using TMPro;
|
||||
|
||||
namespace BaseGames.UI
|
||||
{
|
||||
/// <summary>
|
||||
/// 滑条控件封装:Slider + 实时数值标签 + 一行式 <see cref="Bind"/>,
|
||||
/// 消除 <see cref="SettingsPanelController"/> 里"移除监听→设值→加监听→更新标签"的重复样板。
|
||||
/// </summary>
|
||||
[DisallowMultipleComponent]
|
||||
public class UISlider : MonoBehaviour
|
||||
{
|
||||
[SerializeField] private Slider _slider;
|
||||
[Tooltip("实时数值标签(可空)。")]
|
||||
[SerializeField] private TMP_Text _valueLabel;
|
||||
[Tooltip("数值标签格式(当未传 fmt 委托时使用)。例:\"{0:0}\"、\"{0:0}%\"。")]
|
||||
[SerializeField] private string _format = "{0:0}";
|
||||
|
||||
private Func<float, string> _fmt;
|
||||
|
||||
public Slider Slider => _slider;
|
||||
public float Value => _slider != null ? _slider.value : 0f;
|
||||
|
||||
/// <summary>
|
||||
/// 绑定取值范围、初值与变更回调。<paramref name="fmt"/> 可自定义数值标签文本(优先于 <see cref="_format"/>)。
|
||||
/// </summary>
|
||||
public void Bind(float min, float max, float value, UnityAction<float> onChanged, Func<float, string> fmt = null)
|
||||
{
|
||||
if (_slider == null) return;
|
||||
_slider.onValueChanged.RemoveAllListeners();
|
||||
_slider.minValue = min;
|
||||
_slider.maxValue = max;
|
||||
_slider.value = Mathf.Clamp(value, min, max);
|
||||
_fmt = fmt;
|
||||
UpdateLabel(_slider.value);
|
||||
_slider.onValueChanged.AddListener(v =>
|
||||
{
|
||||
onChanged?.Invoke(v);
|
||||
UpdateLabel(v);
|
||||
});
|
||||
}
|
||||
|
||||
private void UpdateLabel(float v)
|
||||
{
|
||||
if (_valueLabel == null) return;
|
||||
_valueLabel.text = _fmt != null ? _fmt(v) : string.Format(_format, v);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user