Files
Fishing2/Assets/Scripts/Common/Services/Settings/GameSettings.cs
2025-05-29 18:26:40 +08:00

301 lines
12 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 Newtonsoft.Json;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
namespace NBF
{
public class GameSettings : MonoService<GameSettings>
{
public enum QualityEnum
{
Low = 0,
Medium = 1,
High = 2,
Ultra = 3
}
public enum VSyncEnum
{
Off = 0,
On = 1,
}
/// <summary>
/// 抗锯齿等级
/// </summary>
public enum AntiAliasLevelEnum
{
Off = 1,
x2 = 2,
x4 = 4,
x8 = 8
}
/// <summary>
/// 贴图质量
/// </summary>
public enum TextureQualityEnum
{
FullRes = 0,
HalfRes = 1,
QuarterRes = 2,
EighthRes = 3
}
public enum AnisotropicLevelEnum
{
Off = -1,
x2 = 2,
x4 = 4,
x8 = 8,
x16 = 16
}
public enum ShadowmapResolutionEnum
{
Low = 0,
Medium = 1,
High = 2,
}
public const string SaveKey = "PlayerGameSetting";
[System.Serializable]
public class GameSettingsData
{
/// <summary>
/// 质量等级 0 1 2 3
/// </summary>
// [Title("Settings_Title_quality")] [Description("Settings_Description_quality")]
[Title("图像质量")] [Description("图像质量324234图像质量图像质量图像质量图像质量3434")]
public QualityEnum QualityLevel = QualityEnum.High;
/// <summary>
/// 显示分辨率有任意一个为0则为全屏
/// </summary>
[Title("Settings_Title_Resolution")] [Description("Settings_Description_Resolution")]
public Vector2Int Resolution = new Vector2Int(0, 0);
/// <summary>
/// 渲染比例
/// </summary>
[Title("Settings_Title_RenderScale")] [Description("Settings_Description_RenderScale")] [Range(0.1f, 2f)]
public float RenderScale = 1f;
/// <summary>
/// 窗口模式
/// </summary>
[Title("Settings_Title_WindowedMode")] [Description("Settings_Description_WindowedMode")]
public FullScreenMode WindowedMode = FullScreenMode.MaximizedWindow;
/// <summary>
/// 垂直同步个数
/// </summary>
[Title("Settings_Title_VSync")] [Description("Settings_Description_VSync")]
public VSyncEnum VSync = VSyncEnum.Off;
/// <summary>
///抗锯齿等级
/// </summary>
[Title("Settings_Title_AntiAliasLevel")] [Description("Settings_Description_AntiAliasLevel")]
public AntiAliasLevelEnum AntiAliasLevel = AntiAliasLevelEnum.Off;
/// <summary>
/// 纹理质量
/// </summary>
[Title("Settings_Title_TextureQuality")] [Description("Settings_Description_TextureQuality")]
public TextureQualityEnum TextureQuality = TextureQualityEnum.FullRes;
/// <summary>
/// 全局各向异性纹理过滤模式
/// </summary>
[Title("Settings_Title_AnisotropicMode")] [Description("Settings_Description_AnisotropicMode")]
public AnisotropicFiltering AnisotropicMode = AnisotropicFiltering.Enable;
/// <summary>
/// 全局各向异性过滤限制
/// </summary>
[Title("Settings_Description_AnisotropicLevel")] [Description("Settings_Description_AnisotropicLevel")]
public AnisotropicLevelEnum AnisotropicLevel = AnisotropicLevelEnum.x4;
/// <summary>
/// 阴影等级
/// </summary>
[Title("Settings_Description_ShadowmapResolution")]
[Description("Settings_Description_ShadowmapResolution")]
public ShadowmapResolutionEnum ShadowmapResolution = ShadowmapResolutionEnum.High;
}
/// <summary>
/// 默认配置
/// </summary>
private GameSettingsData DefaultSettingsConverted = new GameSettingsData();
/// <summary>
/// 当前正在调整的配置
/// </summary>
private GameSettingsData CurrentSettings = new GameSettingsData();
/// <summary>
/// 当前使用配置
/// </summary>
public readonly GameSettingsData UseSettings = new GameSettingsData();
protected override void OnAwake()
{
LoadSettings();
}
/// <summary>
/// 重置
/// </summary>
public void ResetSettings()
{
CurrentSettings.QualityLevel = DefaultSettingsConverted.QualityLevel;
CurrentSettings.Resolution = DefaultSettingsConverted.Resolution;
CurrentSettings.RenderScale = DefaultSettingsConverted.RenderScale;
CurrentSettings.WindowedMode = DefaultSettingsConverted.WindowedMode;
CurrentSettings.VSync = DefaultSettingsConverted.VSync;
CurrentSettings.AntiAliasLevel = DefaultSettingsConverted.AntiAliasLevel;
CurrentSettings.TextureQuality = DefaultSettingsConverted.TextureQuality;
CurrentSettings.AnisotropicMode = DefaultSettingsConverted.AnisotropicMode;
CurrentSettings.AnisotropicLevel = DefaultSettingsConverted.AnisotropicLevel;
CurrentSettings.ShadowmapResolution = DefaultSettingsConverted.ShadowmapResolution;
}
/// <summary>
/// 开始进入设置模式,将当前使用的配置缓存一份
/// </summary>
public void BeginChangeSettings()
{
UseSettings.QualityLevel = CurrentSettings.QualityLevel;
UseSettings.Resolution = CurrentSettings.Resolution;
UseSettings.RenderScale = CurrentSettings.RenderScale;
UseSettings.WindowedMode = CurrentSettings.WindowedMode;
UseSettings.VSync = CurrentSettings.VSync;
UseSettings.AntiAliasLevel = CurrentSettings.AntiAliasLevel;
UseSettings.TextureQuality = CurrentSettings.TextureQuality;
UseSettings.AnisotropicMode = CurrentSettings.AnisotropicMode;
UseSettings.AnisotropicLevel = CurrentSettings.AnisotropicLevel;
UseSettings.ShadowmapResolution = CurrentSettings.ShadowmapResolution;
}
/// <summary>
/// 保存设置
/// </summary>
public void SaveSettings()
{
CurrentSettings.QualityLevel = UseSettings.QualityLevel;
CurrentSettings.Resolution = UseSettings.Resolution;
CurrentSettings.RenderScale = UseSettings.RenderScale;
CurrentSettings.WindowedMode = UseSettings.WindowedMode;
CurrentSettings.VSync = UseSettings.VSync;
CurrentSettings.AntiAliasLevel = UseSettings.AntiAliasLevel;
CurrentSettings.TextureQuality = UseSettings.TextureQuality;
CurrentSettings.AnisotropicMode = UseSettings.AnisotropicMode;
CurrentSettings.AnisotropicLevel = UseSettings.AnisotropicLevel;
CurrentSettings.ShadowmapResolution = UseSettings.ShadowmapResolution;
var json = JsonConvert.SerializeObject(CurrentSettings);
PlayerPrefs.SetString(SaveKey, json);
}
private void LoadSettings()
{
ResetSettings();
if (PlayerPrefs.HasKey(SaveKey))
{
var json = PlayerPrefs.GetString(SaveKey, string.Empty);
if (!string.IsNullOrEmpty(json))
{
var settings = JsonConvert.DeserializeObject<GameSettingsData>(json);
if (settings != null)
{
CurrentSettings.QualityLevel = settings.QualityLevel;
CurrentSettings.Resolution = settings.Resolution;
CurrentSettings.RenderScale = settings.RenderScale;
CurrentSettings.WindowedMode = settings.WindowedMode;
CurrentSettings.VSync = settings.VSync;
CurrentSettings.AntiAliasLevel = settings.AntiAliasLevel;
CurrentSettings.TextureQuality = settings.TextureQuality;
CurrentSettings.AnisotropicMode = settings.AnisotropicMode;
CurrentSettings.AnisotropicLevel = settings.AnisotropicLevel;
CurrentSettings.ShadowmapResolution = settings.ShadowmapResolution;
}
}
}
if (CurrentSettings.Resolution.x < 1 || CurrentSettings.Resolution.y < 1)
{
CurrentSettings.WindowedMode = FullScreenMode.ExclusiveFullScreen;
CurrentSettings.Resolution = new Vector2Int(Screen.width, Screen.height);
}
ApplySettings();
}
/// <summary>
/// 应用设置
/// </summary>
private void ApplySettings()
{
// // 设置当前质量等级
QualitySettings.SetQualityLevel((int)CurrentSettings.QualityLevel);
switch (CurrentSettings.WindowedMode)
{
case FullScreenMode.ExclusiveFullScreen:
Screen.SetResolution(Screen.width, Screen.width, FullScreenMode.ExclusiveFullScreen);
break;
case FullScreenMode.FullScreenWindow:
Screen.SetResolution(CurrentSettings.Resolution.x, CurrentSettings.Resolution.y,
FullScreenMode.FullScreenWindow);
break;
case FullScreenMode.MaximizedWindow:
Screen.SetResolution(CurrentSettings.Resolution.x, CurrentSettings.Resolution.y,
FullScreenMode.MaximizedWindow);
break;
case FullScreenMode.Windowed:
Screen.SetResolution(CurrentSettings.Resolution.x, CurrentSettings.Resolution.y,
FullScreenMode.Windowed);
break;
default:
Screen.SetResolution(Screen.width, Screen.width, FullScreenMode.ExclusiveFullScreen);
break;
}
// 获取当前URP Asset
UniversalRenderPipelineAsset URPAsset =
QualitySettings.GetRenderPipelineAssetAt(QualitySettings.GetQualityLevel()) as
UniversalRenderPipelineAsset;
if (URPAsset)
{
//渲染比例
URPAsset.renderScale = CurrentSettings.RenderScale;
//抗锯齿等级
URPAsset.msaaSampleCount = (int)CurrentSettings.AntiAliasLevel;
URPAsset.supportsHDR = true;
//纹理质量
QualitySettings.globalTextureMipmapLimit = (int)CurrentSettings.TextureQuality;
QualitySettings.anisotropicFiltering = CurrentSettings.AnisotropicMode;
if (CurrentSettings.AnisotropicMode == AnisotropicFiltering.Disable ||
CurrentSettings.AnisotropicMode == AnisotropicFiltering.Enable)
{
Texture.SetGlobalAnisotropicFilteringLimits(-1, -1);
}
else if (CurrentSettings.AnisotropicMode == AnisotropicFiltering.ForceEnable)
{
Texture.SetGlobalAnisotropicFilteringLimits((int)CurrentSettings.AnisotropicLevel,
(int)CurrentSettings.AnisotropicLevel);
}
//垂直同步
QualitySettings.vSyncCount = (int)CurrentSettings.VSync;
}
}
}
}