Files
5.24BuYu/Assets/MyGame/aa/UI/Home/Sub/UIHome_BY_SettingPenel.cs
T
2026-08-04 18:17:09 +08:00

151 lines
5.5 KiB
C#

using DG.Tweening.Core.Easing;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.Audio;
using UnityEngine.Serialization;
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;
[FormerlySerializedAs("toggle_Fps60")]
public Toggle toggle_Fps45;
[FormerlySerializedAs("toggle_FpsUnlimited")]
public Toggle toggle_Fps60;
public ToggleGroup group_Fps;
private Dictionary<Toggle, Color> labelOriginalColors = new Dictionary<Toggle, Color>();
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_Fps45);
CacheToggleColor(toggle_Fps60);
int fps = PlayerPrefs.GetInt("TargetFps", 2);
ApplyFps(fps);
toggle_Fps30?.onValueChanged.AddListener(a => { if (a) SetFps(0); });
toggle_Fps45?.onValueChanged.AddListener(a => { if (a) SetFps(1); });
toggle_Fps60?.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<TextMeshProUGUI>();
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<TextMeshProUGUI>();
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);
QualitySettings.SetQualityLevel(level, true);
}
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_Fps45 != null) toggle_Fps45.isOn = (level == 1);
if (toggle_Fps60 != null) toggle_Fps60.isOn = (level == 2);
UpdateToggleColor(toggle_Fps30, level == 0);
UpdateToggleColor(toggle_Fps45, level == 1);
UpdateToggleColor(toggle_Fps60, level == 2);
// 关键:vSyncCount != 0 会让 Application.targetFrameRate 失效(被屏幕刷新率覆盖)。
// Balanced/High Fidelity 画质默认 vSyncCount=1,必须强制关闭才能让帧率档位生效。
QualitySettings.vSyncCount = 0;
switch (level)
{
case 0: Application.targetFrameRate = 30; break;
case 1: Application.targetFrameRate = 45; break;
case 2: Application.targetFrameRate = 60; break;
}
}
}