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

Godot中修改ConfigFile时覆盖整个文件的问题求助

ConfigFile 存档丢失原有数据的解决方案

你的问题出在每次保存时都创建了全新的ConfigFile实例,没有加载已有的存档内容,直接修改并保存会覆盖掉原来的所有数据,只保留本次修改的内容。

修正后的保存代码

func save_stats():
    print("--- saving... ---")
    var config = ConfigFile.new()
    # 先加载已有的存档文件,不存在则返回错误(不影响后续操作)
    var error = config.load(save_path)
    # 如果是新文件(存档不存在),初始化所有关卡的默认值
    if error == ERR_FILE_NOT_FOUND:
        # 示例:初始化Level1到Level3的默认MaxPoints为false
        config.set_value("Level1", "MaxPoints", false)
        config.set_value("Level2", "MaxPoints", false)
        config.set_value("Level3", "MaxPoints", false)
    
    # 正确提取关卡编号(原代码直接转整数会失效,因为scene_file_path是完整路径)
    var level_path = get_tree().get_current_scene().scene_file_path
    var level_filename = level_path.get_file() # 得到类似"Level1.tscn"的文件名
    var level_int = level_filename.get_basename().replace("Level", "").to_int() # 提取出数字1
    
    # 修改对应关卡的MaxPoints值
    config.set_value("Level" + str(level_int), "MaxPoints", totalCoins == coinsCollected)
    
    # 保存(此时会保留原有数据,仅更新修改的部分)
    config.save(save_path)
    print("---saving done.---")

关键注意事项

  • 必须先加载现有存档:调用config.load(save_path)后,ConfigFile会读取文件中已有的所有章节和键值对,后续修改只会覆盖指定的键,不会清除其他数据。
  • 新存档初始化:如果是第一次运行游戏,存档文件不存在,load()会返回ERR_FILE_NOT_FOUND,此时可以在这里初始化所有关卡的默认统计数据,避免后续读取时找不到对应键。
  • 关卡编号的正确获取:原代码直接将完整路径转整数大概率失败,通过get_file()和get_basename()提取文件名中的关卡编号更可靠。

ConfigFile 核心使用逻辑

  1. 加载已有配置:用load()或try_load()读取本地存档文件,将数据加载到ConfigFile实例中。
  2. 修改/新增数据:用set_value(章节名, 键名, 值)修改指定数据,新增章节或键时会自动创建。
  3. 保存配置:调用save()将当前ConfigFile中的所有数据写入文件,覆盖原有文件(但因为已经加载了原有数据,所以只会更新修改的部分)。

相比数组存储,ConfigFile的章节+键值结构可以直接通过get_value("Level1", "MaxPoints")读取指定关卡的统计数据,无需遍历数组,更适合关卡统计的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:23:12