首页
/ HsMod数据持久化方案:ConfigValue实现用户配置保存

HsMod数据持久化方案:ConfigValue实现用户配置保存

2026-02-05 04:21:38作者:温艾琴Wonderful

在游戏插件开发中,用户配置的持久化存储是提升体验的关键功能。HsMod作为基于BepInEx框架的《炉石传说》插件,采用ConfigValue机制实现配置的自动加载与保存,确保用户设置在游戏重启后依然生效。本文将从配置定义、数据绑定到持久化流程,全面解析HsMod的配置管理方案。

配置系统核心组件

HsMod的配置系统围绕PluginConfig类构建,该类位于HsMod/PluginConfig.cs,通过BepInEx的ConfigEntry<T>泛型接口实现类型安全的配置管理。核心组件包括:

  • 配置定义:使用静态ConfigEntry<T>字段声明配置项,支持bool、int、string等多种类型
  • 数据验证:通过AcceptableValueRange<T>限制数值范围,如帧率限制[1-2333]
  • 本地化支持:结合HsMod/LocalizationManager.cs实现多语言配置说明
  • 持久化存储:自动映射到插件目录下的config文件,格式为UTF-8编码的键值对
// 配置示例:帧率限制(HsMod/PluginConfig.cs L183)
targetFrameRate = config.Bind(
    LocalizationManager.GetLangValue("targetFrameRate.label"), 
    LocalizationManager.GetLangValue("targetFrameRate.name"), 
    -1, 
    new ConfigDescription(
        LocalizationManager.GetLangValue("targetFrameRate.description"), 
        new AcceptableValueRange<int>(-1, 2333)
    )
);

配置加载流程解析

HsMod在插件启动时执行配置初始化,流程如下:

  1. 配置文件绑定:在Plugin.Awake()方法中调用ConfigBind(),将配置项与物理文件关联
  2. 默认值设置:为未定义的配置项提供默认值,如isPluginEnable默认启用插件
  3. 本地化适配:通过LocalizationManager.GetLangValue()加载多语言配置说明
  4. 运行时修改:支持通过快捷键(如F4)动态重载配置,无需重启游戏
sequenceDiagram
    participant Plugin as 插件主程序
    participant Config as 配置系统
    participant File as 配置文件
    participant Local as 本地化服务
    
    Plugin->>Config: 调用ConfigBind()
    Config->>File: 读取config文件
    alt 文件不存在
        Config->>Config: 设置默认值
    end
    Config->>Local: 获取本地化描述
    Local-->>Config: 返回多语言文本
    Config-->>Plugin: 配置项就绪
    Plugin->>Config: 运行时修改配置
    Config->>File: 自动保存变更

高级配置特性

1. 配置模板系统

HsMod提供预设配置模板,通过configTemplate字段快速切换配置方案:

// 配置模板定义(HsMod/Utils.cs L70-78)
public enum ConfigTemplate {
    [Description("默认")]
    DoNothing,
    [Description("挂机")]
    AwayFromKeyboard,
    [Description("反挂机")]
    AntiAwayFromKeyboard
}

模板应用场景包括:

  • 挂机模式:自动启用时间齿轮与自动操作
  • 竞技模式:禁用所有可能影响平衡的功能
  • 开发模式:开启调试日志与内部接口

2. 热重载机制

通过WebServer.Restart()PatchManager.PatchSettingDelegate()实现配置热更新:

// 热重载触发(HsMod/Main.cs L179)
if (Input.GetKeyUp(KeyCode.F4)) {
    LoadSkinsConfigFromFile();
    WebServer.Restart();
    UIStatus.Get().AddInfo("配置已重载");
}

3. 类型安全保障

通过泛型ConfigEntry<T>确保配置类型一致性,支持的类型包括:

  • 基础类型:bool(isPluginEnable)、int(timeGear)、string(webPageBackImg)
  • 枚举类型:KeyboardShortcut(快捷键)、Utils.CardState(卡牌状态)
  • 自定义类型:通过TypeConverter实现复杂对象的序列化

最佳实践与避坑指南

配置项命名规范

遵循功能.模块.属性命名模式,如:

  • HsMod.Init.Language:初始化相关配置
  • skin.Hero:皮肤相关配置
  • webServer.Port:网络服务配置

敏感配置保护

对于高级配置项,通过Advanced标签隐藏,防止普通用户误操作:

// 高级配置示例(HsMod/PluginConfig.cs L160)
pluginInitLanague = config.Bind(
    "HsMod", 
    "HsMod.Init.Language", 
    "UNKNOWN", 
    new ConfigDescription(
        "(!!! DON'T EDIT IT) 初始化语言", 
        null, 
        new object[] { "Advanced" }
    )
);

多场景配置适配

根据游戏模式动态调整配置生效范围,如:

// 模式化配置(HsMod/Main.cs L245)
if (GameMgr.Get().IsBattlegrounds() && keyShutUpBob.Value.IsDown()) {
    isShutUpBobEnable.Value = !isShutUpBobEnable.Value;
}

配置文件结构解析

生成的配置文件位于BepInEx/config目录,格式如下:

## 插件启用状态
# 标签: 插件设置
# 描述: 启用或禁用HsMod插件
# 默认值: True
HsMod.IsPluginEnable = True

## 帧率限制
# 标签: 显示设置
# 描述: 设置游戏最大帧率(-1为不限制)
# 范围: -1 ~ 2333
# 默认值: -1
TargetFrameRate = 60

配置文件采用INI格式,支持:

  • 分组管理([HsMod]
  • 注释说明(# 描述
  • 类型标注(范围: -1 ~ 2333

扩展应用:皮肤配置管理

HsMod将皮肤相关配置单独管理,通过skinCoinskinHero等字段实现个性化皮肤设置:

// 皮肤配置(HsMod/PluginConfig.cs L231-239)
skinCoin = config.Bind(
    LocalizationManager.GetLangValue("skinCoin.label"), 
    LocalizationManager.GetLangValue("skinCoin.name"), 
    -1, 
    LocalizationManager.GetLangValue("skinCoin.description")
);
skinHero = config.Bind(
    LocalizationManager.GetLangValue("skinHero.label"), 
    LocalizationManager.GetLangValue("skinHero.name"), 
    -1, 
    LocalizationManager.GetLangValue("skinHero.description")
);

皮肤配置支持动态加载,通过LoadSkinsConfigFromFile()方法应用用户自定义皮肤方案。

总结与扩展建议

HsMod的ConfigValue方案实现了:

  • 类型安全的配置管理
  • 多语言支持的用户界面
  • 动态重载的开发效率
  • 模式化的配置模板

建议扩展方向:

  1. 配置导出/导入:添加JSON格式的配置备份功能
  2. 配置同步:通过WebServer实现多设备配置同步
  3. 配置分享:支持生成配置方案二维码分享

通过本文介绍的ConfigValue机制,开发者可以快速实现插件的配置管理功能,同时为用户提供安全、灵活的个性化设置体验。完整配置系统实现可参考HsMod/PluginConfig.cs源代码。

登录后查看全文
热门项目推荐
相关项目推荐