Sub系统与注册表
UGSS_GameSettingsSubsystem 是 Local Player Subsystem,负责创建和持有 UGSS_GameSettingRegistry。Registry 汇总设置树、按 SettingId 查找节点、过滤可见项,并发出值变化、Apply、Action、导航和编辑状态事件。
Definition Data Asset 适合静态、可复用的设置树;UGSS_GameSettingsProvider 适合依赖运行时状态、需要动态注册或注销的设置。Provider 应通过传入的 UGSS_GameSettingsBuilder 添加节点,以便子系统统一跟踪生命周期、依赖和待提交状态。
设置树与标识
使用 Page 和 Collection 组织导航和值节点;值节点可表示 Bool、Discrete、Scalar 或 Action。每个设置都应使用稳定且全局唯一的 Gameplay Tag 作为 SettingId。不要依赖显示名称或开发者名称作为跨系统引用。
Provider Builder 提供 AddBool、AddDiscrete、AddScalar、AddAction 等入口。C++ Provider 在注册时构建节点;蓝图 Provider 使用类型化的 Add 节点。需要移除动态内容时,用注册令牌注销对应 Provider,避免留下过期的节点与事件绑定。
Accessor 与存储
- Local Accessor 连接项目的本地引擎设置,常用于
UGameUserSettings所拥有的机器级选项。 - Shared Accessor 连接当前 Local Player 的
UGSS_SettingsShared。项目可继承该类,添加 SaveGame 属性及匹配签名的 Getter/Setter。
Accessor 的 Getter/Setter 使用反射函数。项目自定义 Shared Settings 时,重写 ApplySettings 将已加载的偏好应用到项目系统;需要额外持久化时重写 SaveSettings。默认 Shared 保存使用 LocalPlayer SaveGame 的异步写入。
修改与提交
普通待应用节点由 Apply 提交;Cancel 恢复 Registry 跟踪的基线;Reload 丢弃待编辑内容并重新读取存储值。Dynamic Discrete/Scalar 会立即调用 Accessor,以支持预览;ApplyChanges 负责持久化,而项目应为即时预览定义明确的恢复行为。
编辑条件可以控制隐藏、禁用、排除选项或是否允许重置。条件依赖通过 SettingId 建立,注册与注销后由 Registry 重新解析依赖。跨 Provider 依赖时,确保 SettingId 不冲突且目标节点确实存在。