151 lines
5.7 KiB
C#
151 lines
5.7 KiB
C#
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;
|
||
}
|
||
}
|
||
} |