主题
客户端设置系统
GameCore.ClientSettings 提供客户端代码访问游戏设置的统一入口,适合制作项目自己的设置面板,或在运行时切换画质、帧率、音频和少量本地偏好。
使用边界
- 仅客户端可用。相关代码应放在
#if CLIENT内。 - 设置功能请使用独立客户端调试验证。 编辑器内调试(PIE)暂未完整支持
Graphics、Audio和Preferences的保存与读回,不能据此判断独立客户端是否正常;Preferences的Game和Device两种作用域均受此限制。无头编辑器启动的独立调试客户端可用于验证。 - PIE 中调用这些 API 仍可能修改编辑器进程的音量、帧率或抗锯齿,结束调试时不保证恢复。配套新版编辑器会在每个 PIE 游戏局首次读写设置时警告一次;提示不会阻止调用,也不改变现有设置行为。
- 设置保存在当前设备或当前游戏的本地配置中,不同步服务器,也不作为玩法权威数据。
- 普通设置可在打开 UI 时读取,用户确认或拖动控件时写入。需要选项变化通知、默认值或本会话覆盖时,使用能力版本 9 的 ClientPlatform。
- 不要把进度、货币、背包、付费状态或跨设备存档放进本地偏好;这些数据应使用 CloudData 或项目自己的服务端逻辑。
入口
常用入口在 GameCore.ClientSettings 命名空间下:
csharp
#if CLIENT
using GameCore.ClientSettings;
ClientSettings.Graphics.Preset = GraphicsPreset.Balanced;
ClientSettings.Graphics.MaxFrameRate = 120;
ClientSettings.Audio.Music.Volume = 70;
ClientSettings.Audio.Effects.Enabled = true;
ClientSettings.Preferences.SetBool("show_damage_numbers", true);
#endifClientSettings 分为三组:
| 入口 | 用途 |
|---|---|
ClientSettings.Graphics | 画质预设、帧率、渲染分辨率、场景质量、粒子质量、HDR、抗锯齿等图形选项 |
ClientSettings.Audio | 音乐、音效、语音和麦克风的音量与开关 |
ClientSettings.Preferences | 项目自定义的本地布尔、浮点数和字符串偏好 |
图形设置
图形设置写入平台已有的游戏设置存储,并尽量立即应用到当前客户端。
csharp
#if CLIENT
using GameCore.ClientSettings;
ClientSettings.Graphics.Preset = GraphicsPreset.High;
ClientSettings.Graphics.RenderResolution = RenderResolutionLevel.High;
ClientSettings.Graphics.SceneQuality = SceneQuality.Ultra;
ClientSettings.Graphics.ParticleQuality = ParticleQuality.High;
ClientSettings.Graphics.DynamicLightsEnabled = true;
ClientSettings.Graphics.HdrEnabled = true;
ClientSettings.Graphics.AntiAliasingEnabled = true;
ClientSettings.Graphics.CharacterOcclusionSilhouetteEnabled = true;
#endif帧率上限
MaxFrameRate 是 int? 属性。赋值为正整数表示显式帧率上限;赋值为 null 或调用 ClearMaxFrameRate() 表示取消显式上限。项目代码不需要依赖底层存储的特殊值。
csharp
#if CLIENT
using GameCore.ClientSettings;
ClientSettings.Graphics.MaxFrameRate = 144;
int? cap = ClientSettings.Graphics.MaxFrameRate;
if (cap is null)
{
// 当前没有显式帧率上限。
}
ClientSettings.Graphics.ClearMaxFrameRate();
// 等价写法:ClientSettings.Graphics.MaxFrameRate = null;
#endif预设仍会设置平台推荐的帧率档位,例如省电或流畅模式可能设置 30 / 60 FPS。项目代码直接写入 MaxFrameRate 时可以使用任意正整数,前提是当前客户端底层和设备性能能够支持。
预设与自定义
设置 Preset 会应用一组平台内置画质配置。单独修改分辨率、质量、帧率或图形开关时,平台设置会被标记为 GraphicsPreset.Custom。
RenderResolutionLevel 表示渲染分辨率档位,不是窗口尺寸或 UI 设计分辨率。需要调整 UI 布局时,应使用 GameUI 布局 API;需要控制渲染画面清晰度时才使用这里的渲染分辨率设置。
能力版本 9 中,移动端显式选择低/中档分别请求短边 540/720 像素,高档恢复系统默认 Surface;这不在启动时自动强制某档分辨率。精确尺寸请求、默认 Surface 查询与恢复使用 ClientPlatform,实际结果以视口变化后读回为准。
当前游戏的独立阴影、Cluster、蒙皮、AO、Shader 宏排除和渲染快照使用 GameGraph.Rendering.GameRenderSettings;这些实时属性不自动持久化,需要 ClientRuntimeFeature.GameRenderSettings。
音频设置
音频设置按通道工作:
csharp
#if CLIENT
using GameCore.ClientSettings;
ClientSettings.Audio.Music.Volume = 60;
ClientSettings.Audio.Effects.Volume = 85;
ClientSettings.Audio.Voice.Enabled = false;
var musicVolume = ClientSettings.Audio.Music.Volume;
var effectsEnabled = ClientSettings.Audio.Effects.Enabled;
// 需要动态选择通道时,也可以使用索引器。
ClientSettings.Audio[AudioChannel.Microphone].Enabled = true;
#endifVolume 的范围是 0 到 100。Enabled 用于开关对应通道;关闭通道不要求项目代码自己把音量改成 0。
| 通道 | 常见含义 |
|---|---|
AudioChannel.Music | 背景音乐、环境音乐、过场音乐 |
AudioChannel.Effects | UI、战斗、移动、拟音、场景物件、提示和普通音效 |
AudioChannel.Voice | 游戏内对白/语音和语音聊天播放 |
AudioChannel.Microphone | 麦克风输入 |
AudioChannel 和 GameDataSound.Category 不是同一层概念,也不是两个独立音量因子相乘:
| 层 | 例子 | 作用 |
|---|---|---|
GameDataSound.Category | Combat、Music、Dialogue | 声音自己的分类;ActorSound 播放时会把它写成底层 sound type 字符串 |
| 底层 sound type gain | gain["Combat"] = 0.8 | native 混音时实际使用的分类音量槽 |
AudioChannel | Effects、Music、Voice | 玩家设置里的批量旋钮;一次写多个底层 sound type gain |
因此,ClientSettings.Audio.Effects.Volume = 80 不是设置一个独立的 "Effects" 总线,而是把 UI、Alert、Movement、Foley、Doodad、Combat、Message、Effect 这些底层 sound type gain 批量写成 0.8。如果某个 ActorSound 的 GameDataSound.Category 是 Combat,它会受到 Effects 通道影响,因为它命中了同一个 gain["Combat"] 槽。Music 会覆盖 Ambient、Music、Cutscene、BackgroundMusic;Voice 会覆盖 Dialogue、Voice,并同步语音聊天播放音量。
自定义本地偏好
ClientSettings.Preferences 适合保存项目自己的轻量本地偏好,例如是否显示伤害数字、镜头灵敏度、本地 UI 皮肤选择、辅助准星开关等。
csharp
#if CLIENT
using GameCore.ClientSettings;
ClientSettings.Preferences.SetBool("show_damage_numbers", true);
ClientSettings.Preferences.SetFloat("camera_sensitivity", 0.75f);
ClientSettings.Preferences.SetString("hud_layout", "compact");
var showDamageNumbers = ClientSettings.Preferences.GetBool("show_damage_numbers", defaultValue: true);
var sensitivity = ClientSettings.Preferences.GetFloat("camera_sensitivity", defaultValue: 0.5f);
var hudLayout = ClientSettings.Preferences.GetString("hud_layout", defaultValue: "default");
#endif默认 scope 是 ClientSettingScope.Game,表示偏好随当前游戏/项目隔离。需要保存同一设备上跨项目共享的工具类偏好时,可以显式使用 ClientSettingScope.Device:
csharp
#if CLIENT
ClientSettings.Preferences.SetBool(
"developer_overlay_enabled",
true,
ClientSettingScope.Device);
#endif自定义偏好的 key 应稳定、可读,并尽量使用项目自己的命名习惯。不要保存大 JSON、敏感信息、账号凭据或需要跨设备同步的数据。
与平台设置面板的关系
内置图形和音频选项写入平台已有设置。平台设置面板再次打开时通常会从当前平台设置构造界面,因此项目代码写入的内置选项可以被面板读取到。
需要注意的是,平台面板的控件不一定能表达项目代码写入的所有值。例如项目代码可以设置任意正整数帧率上限,但面板如果只提供固定档位,显示和再次保存时可能会折回到面板支持的值。项目自定义的 Preferences 不会自动出现在平台通用设置面板中,应由项目自己的 UI 读取和展示。
推荐模式
- 打开项目设置 UI 时,读取一次
ClientSettings当前值初始化控件。 - 用户拖动滑条或点击确认时写入设置,不要每帧轮询或重复写入。
- 图形预设适合提供“一键省电 / 流畅 / 平衡 / 高画质”;细项开关适合高级设置页。
- 如果某个视觉效果需要全体玩家一致,由服务端同步“意图”,每个客户端收到后再应用本地设置或视觉参数。
验证
powershell
dotnet build src\GameEntry.csproj -c Client-Debug运行客户端后验证:
- 打开项目设置 UI,确认初始值来自
ClientSettings。 - 修改画质、帧率或音频,观察是否立即生效。
- 退出并重新进入游戏,确认本地配置按预期保留。
- 如需对照平台设置面板,重新打开面板检查内置图形/音频项是否合理显示。