using TMPro; using UnityEngine; using UnityEngine.UI; using BaseGames.Core; namespace BaseGames.UI { /// /// 设置面板控制器(架构 10_UIModule §7)。 /// 驱动 SettingsManager 的音量与画面设置,并从当前配置初始化控件值。 /// public class SettingsPanelController : MonoBehaviour { [SerializeField] private SettingsManager _settings; [Header("音量滑条")] [SerializeField] private Slider _masterVolume; [SerializeField] private Slider _bgmVolume; [SerializeField] private Slider _sfxVolume; [SerializeField] private Slider _ambientVolume; [Header("画面")] [SerializeField] private Toggle _vSyncToggle; [SerializeField] private TMP_Dropdown _fpsDropdown; // 30 / 60 / 120 / 无限 [Header("按键重绑定")] [SerializeField] private GameObject _rebindPanelRoot; // RebindPanel GameObject private static readonly int[] FpsOptions = { 30, 60, 120, -1 }; private void Start() { if (_settings == null) return; var data = _settings.Current; // 初始化控件值(不触发 onChange;先移除监听再设置值再添加) InitSlider(_masterVolume, data.MasterVolume, v => _settings.SetMasterVolume(v)); InitSlider(_bgmVolume, data.BGMVolume, v => _settings.SetBGMVolume(v)); InitSlider(_sfxVolume, data.SFXVolume, v => _settings.SetSFXVolume(v)); InitSlider(_ambientVolume,data.AmbientVolume, v => _settings.SetAmbientVolume(v)); if (_vSyncToggle != null) { _vSyncToggle.isOn = data.VSync; _vSyncToggle.onValueChanged.AddListener(v => _settings.SetVSync(v)); } if (_fpsDropdown != null) { int idx = System.Array.IndexOf(FpsOptions, data.TargetFPS); _fpsDropdown.value = idx >= 0 ? idx : 1; // default 60 _fpsDropdown.onValueChanged.AddListener(i => _settings.SetTargetFrameRate(FpsOptions[Mathf.Clamp(i, 0, FpsOptions.Length - 1)])); } } // ── 辅助 ────────────────────────────────────────────────────────────── private static void InitSlider(Slider slider, float value, UnityEngine.Events.UnityAction onChange) { if (slider == null) return; slider.value = value; slider.onValueChanged.AddListener(onChange); } } }