You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#游戏开发中编写与修改配置文件的更佳方案咨询

嘿,很高兴你在通过做游戏练手提升编程能力!对于游戏里可编辑的配置需求,确实有比传统.ini文件更简便、更贴合C#生态的方案,我给你整理几个常用的选项,你可以根据自己的需求选:

1. JSON配置(最推荐)

JSON格式可读性强,而且C#有原生的System.Text.Json(.NET Core 3.0+)或者老牌的Newtonsoft.Json(Json.NET)支持,完全不需要手动解析键值对,强类型的配置类能让你少踩很多坑,和游戏内设置菜单结合也超方便。

举个简单例子:
首先定义你的配置类,默认值直接写在属性里:

public class GameSettings
{
    public int ScreenWidth { get; set; } = 1920;
    public int ScreenHeight { get; set; } = 1080;
    public bool Fullscreen { get; set; } = true;
    public float MasterVolume { get; set; } = 0.7f;
    public string PlayerName { get; set; } = "DefaultPlayer";
}

然后保存配置(比如用户在设置菜单修改后点击保存):

// 假设settings是用户修改后的实例
var settings = new GameSettings 
{ 
    ScreenWidth = 1280, 
    ScreenHeight = 720, 
    Fullscreen = false,
    PlayerName = "MyGameName"
};

// 序列化成格式化后的JSON,方便手动编辑
string jsonContent = JsonSerializer.Serialize(settings, new JsonSerializerOptions { WriteIndented = true });
// 保存到游戏目录下的settings.json文件
File.WriteAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "settings.json"), jsonContent);

加载配置(程序启动时):

string configPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "settings.json");
GameSettings loadedSettings = null;

if (File.Exists(configPath))
{
    string jsonContent = File.ReadAllText(configPath);
    loadedSettings = JsonSerializer.Deserialize<GameSettings>(jsonContent);
}
else
{
    // 如果配置文件不存在,用默认值
    loadedSettings = new GameSettings();
}

// 把配置应用到游戏里,比如设置窗口大小、音量等
// GameWindow.SetSize(loadedSettings.ScreenWidth, loadedSettings.ScreenHeight);

这个方案的好处是:配置类和游戏逻辑绑定紧密,修改配置时直接操作类的属性就行,完全不用处理字符串解析,出错概率低,而且JSON文件用户也能手动打开修改,很灵活。

2. XML配置(原生支持,适合结构化需求)

如果你需要更严格的结构化配置,或者项目里已经在用XML,.NET原生的XmlSerializer也能搞定,用法和JSON类似,只是序列化格式换成XML。

配置类和JSON的一样,保存和加载代码:

// 保存配置
var settings = new GameSettings();
var serializer = new XmlSerializer(typeof(GameSettings));
using (var writer = new StreamWriter("settings.xml"))
{
    serializer.Serialize(writer, settings);
}

// 加载配置
GameSettings loadedSettings = null;
var serializer = new XmlSerializer(typeof(GameSettings));
using (var reader = new StreamReader("settings.xml"))
{
    loadedSettings = (GameSettings)serializer.Deserialize(reader);
}

XML的优点是原生支持,不需要额外装NuGet包,但可读性不如JSON,手动编辑也麻烦一点,适合对结构要求高的场景。

3. .NET App.config(适合桌面应用,不推荐频繁修改)

如果你的游戏是Windows Forms/WPF这类桌面应用,也可以用内置的App.config文件,通过ConfigurationManager读取配置。不过这个方案更适合不需要用户频繁修改的配置,因为修改后需要写回编译后的.exe.config文件,还可能需要管理员权限。

示例:
在项目里添加App.config:

<configuration>
  <appSettings>
    <add key="ScreenWidth" value="1920" />
    <add key="ScreenHeight" value="1080" />
    <add key="Fullscreen" value="True" />
  </appSettings>
</configuration>

读取配置:

int width = int.Parse(ConfigurationManager.AppSettings["ScreenWidth"]);
bool isFullscreen = bool.Parse(ConfigurationManager.AppSettings["Fullscreen"]);

修改并保存配置:

var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings["ScreenWidth"].Value = "1280";
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");

这个方案的好处是不用自己处理文件路径,但灵活性差,不适合游戏内频繁修改的场景。

4. 轻量数据库(比如LiteDB,适合复杂配置/存档)

如果你的游戏需要存储的不只是简单配置,还有用户存档、多个配置文件(比如不同用户的自定义设置),可以用LiteDB这种轻量级的文件型数据库。它不需要单独安装数据库服务,直接以文件形式存储,用法和MongoDB类似,非常适合小型游戏。

首先通过NuGet安装LiteDB包,然后示例代码:

// 连接到数据库文件(不存在会自动创建)
using var db = new LiteDatabase("gameData.db");

// 获取配置集合,用一个固定ID存储全局配置
var settingsCol = db.GetCollection<GameSettings>("globalSettings");

// 保存配置(Upsert会自动插入或更新)
var settings = new GameSettings { Id = 1, ScreenWidth = 1920, PlayerName = "MyPlayer" };
settingsCol.Upsert(settings);

// 加载配置
var loadedSettings = settingsCol.FindById(1);

这个方案的优点是扩展性极强,后续要加存档、用户数据都能直接用同一个数据库,不用自己处理多种文件格式,缺点是比JSON稍复杂一点,适合有进阶需求的场景。


总的来说,JSON配置是最适合你的场景:简单、易维护、强类型,和游戏内设置菜单结合起来几乎零成本,推荐优先用这个方案。

内容的提问来源于stack exchange,提问作者Drake

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:48:25