using DG.Tweening.Core.Easing; using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.Audio; using UnityEngine.UI; public class UIHome_BY_SettingPanel : SubUIBase { public Toggle toggle_SystemSetting;//默认打开系统设置界面 public Slider slider_AudioMusic; public Slider slider_AudioEffect; [Header("画质")] public Toggle toggle_QualityLow; public Toggle toggle_QualityMid; public Toggle toggle_QualityHigh; public ToggleGroup group_Quality; [Header("帧率")] public Toggle toggle_Fps30; public Toggle toggle_Fps60; public Toggle toggle_FpsUnlimited; public ToggleGroup group_Fps; private Dictionary labelOriginalColors = new Dictionary(); private static readonly Color SELECTED_COLOR = Color.white; public Button btn_ChangeUser; public override void Awake() { base.Awake(); btn_ChangeUser.onClick.AddListener(() => { GameManager.Instance.Logout(); }); slider_AudioMusic.value = PlayerPrefs.GetFloat("slider_AudioBG", 1f); slider_AudioEffect.value = PlayerPrefs.GetFloat("slider_FX", 1f); slider_AudioMusic.onValueChanged.AddListener((a) => { PlayerPrefs.SetFloat("slider_AudioBG", a); PlayerPrefs.Save(); // 1. 确保值不会为0 float linearValue = Mathf.Max(a, 0.0001f); // 2. 转换为分贝 float dBValue = 20.0f * Mathf.Log10(linearValue); AudioManager.Instance.audioMixer.SetFloat("BGVolume", dBValue); }); slider_AudioEffect.onValueChanged.AddListener((a) => { PlayerPrefs.SetFloat("slider_FX", a); PlayerPrefs.Save(); // 1. 确保值不会为0 float linearValue = Mathf.Max(a, 0.0001f); // 2. 转换为分贝 float dBValue = 20.0f * Mathf.Log10(linearValue); AudioManager.Instance.audioMixer.SetFloat("FXVolume", dBValue); }); // 画质 CacheToggleColor(toggle_QualityLow); CacheToggleColor(toggle_QualityMid); CacheToggleColor(toggle_QualityHigh); int quality = PlayerPrefs.GetInt("GraphicsQuality", 1); ApplyQuality(quality); toggle_QualityLow?.onValueChanged.AddListener(a => { if (a) SetQuality(0); }); toggle_QualityMid?.onValueChanged.AddListener(a => { if (a) SetQuality(1); }); toggle_QualityHigh?.onValueChanged.AddListener(a => { if (a) SetQuality(2); }); // 帧率 CacheToggleColor(toggle_Fps30); CacheToggleColor(toggle_Fps60); CacheToggleColor(toggle_FpsUnlimited); int fps = PlayerPrefs.GetInt("TargetFps", 1); ApplyFps(fps); toggle_Fps30?.onValueChanged.AddListener(a => { if (a) SetFps(0); }); toggle_Fps60?.onValueChanged.AddListener(a => { if (a) SetFps(1); }); toggle_FpsUnlimited?.onValueChanged.AddListener(a => { if (a) SetFps(2); }); } protected override void OnShow(object args = null) { base.OnShow(args); toggle_SystemSetting.isOn = true; } private void CacheToggleColor(Toggle tg) { if (tg == null) return; var label = tg.GetComponentInChildren(); if (label != null && !labelOriginalColors.ContainsKey(tg)) labelOriginalColors[tg] = label.color; } private void UpdateToggleColor(Toggle tg, bool selected) { if (tg == null || !labelOriginalColors.TryGetValue(tg, out var origColor)) return; var label = tg.GetComponentInChildren(); if (label != null) label.color = selected ? SELECTED_COLOR : origColor; } private void SetQuality(int level) { PlayerPrefs.SetInt("GraphicsQuality", level); PlayerPrefs.Save(); ApplyQuality(level); } private void ApplyQuality(int level) { if (toggle_QualityLow != null) toggle_QualityLow.isOn = (level == 0); if (toggle_QualityMid != null) toggle_QualityMid.isOn = (level == 1); if (toggle_QualityHigh != null) toggle_QualityHigh.isOn = (level == 2); UpdateToggleColor(toggle_QualityLow, level == 0); UpdateToggleColor(toggle_QualityMid, level == 1); UpdateToggleColor(toggle_QualityHigh, level == 2); // 关键:applyExpensiveChanges 必须为 false。 // URP 下每个画质档位绑定不同 URP Asset,SetQualityLevel(true) 会立即重建渲染管线/重编译 shader, // 瞬间 GPU 负载骤增,在低端显卡/驱动不兼容时触发设备重置导致闪退。 // false 表示昂贵更改延迟到安全时机(下一帧)应用,避免闪退。 QualitySettings.SetQualityLevel(level, false); } private void SetFps(int level) { PlayerPrefs.SetInt("TargetFps", level); PlayerPrefs.Save(); ApplyFps(level); } private void ApplyFps(int level) { if (toggle_Fps30 != null) toggle_Fps30.isOn = (level == 0); if (toggle_Fps60 != null) toggle_Fps60.isOn = (level == 1); if (toggle_FpsUnlimited != null) toggle_FpsUnlimited.isOn = (level == 2); UpdateToggleColor(toggle_Fps30, level == 0); UpdateToggleColor(toggle_Fps60, level == 1); UpdateToggleColor(toggle_FpsUnlimited, level == 2); // 中高档统一为 60 帧。移动端强制垂直同步,45 不可用(60Hz 整数倍才合法), // 故中档也直接按 60 处理,避免闪退。 switch (level) { case 0: Application.targetFrameRate = 30; break; case 1: case 2: Application.targetFrameRate = 60; break; } } }