using System; using UnityEngine; using UnityEngine.UI; using UnityEngine.Events; using TMPro; namespace BaseGames.UI { /// /// 滑条控件封装:Slider + 实时数值标签 + 一行式 , /// 消除设置面板里"移除监听→设值→加监听→更新标签"的重复样板。 /// [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 _fmt; public Slider Slider => _slider; public float Value => _slider != null ? _slider.value : 0f; /// /// 绑定取值范围、初值与变更回调。 可自定义数值标签文本(优先于 )。 /// public void Bind(float min, float max, float value, UnityAction onChanged, Func 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); } } }