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

151 lines
5.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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<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_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<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);
// 关键: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;
}
}
}