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 核心使用逻辑
- 加载已有配置:用
load()或try_load()读取本地存档文件,将数据加载到ConfigFile实例中。 - 修改/新增数据:用
set_value(章节名, 键名, 值)修改指定数据,新增章节或键时会自动创建。 - 保存配置:调用
save()将当前ConfigFile中的所有数据写入文件,覆盖原有文件(但因为已经加载了原有数据,所以只会更新修改的部分)。
相比数组存储,ConfigFile的章节+键值结构可以直接通过get_value("Level1", "MaxPoints")读取指定关卡的统计数据,无需遍历数组,更适合关卡统计的场景。
内容的提问来源于stack exchange,提问作者lithopsiouu
相关产品推荐
相关产品推荐

