如何在Godot4重启游戏时加载游戏存档数据?
Godot4 实现玩家进度保存的实用方法
游戏里的临时变量重启就会丢失,必须把数据写入本地文件才能持久化,以下是几种常用的实现方式:
一、JSON格式存储(适配复杂数据结构)
如果你的进度包含关卡列表、道具背包这类嵌套/集合型数据,用JSON存储最灵活。
实现步骤:
- 定义要保存的数据结构
先把需要持久化的内容整理成字典(用自定义类也可以,但字典更方便直接序列化):
var player_data = { "current_level": 3, "unlocked_levels": [1,2,3], "coins": 150, "inventory": ["sword", "shield"] }
- 编写保存函数
用FileAccess类把字典转成JSON字符串,写入user://目录下的文件——这个路径是Godot为每个玩家分配的专属存储区,跨平台且不会被游戏更新覆盖:
func save_progress(): var json_string = JSON.stringify(player_data) var file = FileAccess.open("user://save_data.json", FileAccess.WRITE) if file: file.store_string(json_string) file.close() print("进度保存成功") else: print("保存失败:", FileAccess.get_error_message())
- 编写加载函数
游戏启动或需要读取进度时,读取文件并解析JSON:
func load_progress(): if FileAccess.file_exists("user://save_data.json"): var file = FileAccess.open("user://save_data.json", FileAccess.READ) if file: var json_string = file.get_as_string() file.close() var parse_result = JSON.parse_string(json_string) if parse_result.error == OK: player_data = parse_result.result print("进度加载成功") else: print("JSON解析失败:", parse_result.error_string) else: print("加载失败:", FileAccess.get_error_message()) else: print("无存档,使用默认数据")
二、ConfigFile存储(适合简单键值对)
如果只是存关卡数、金币数这类单一键值对数据,用ConfigFile更省心,不用手动处理JSON序列化逻辑。
实现步骤:
- 保存数据
func save_progress(): var config = ConfigFile.new() config.set_value("Player", "current_level", 3) config.set_value("Player", "coins", 150) config.set_value("Unlocks", "levels", [1,2,3]) var error = config.save("user://save_config.cfg") if error == OK: print("保存成功") else: print("保存失败:", error)
- 加载数据
func load_progress(): var config = ConfigFile.new() var error = config.load("user://save_config.cfg") if error == OK: current_level = config.get_value("Player", "current_level", 1) coins = config.get_value("Player", "coins", 0) unlocked_levels = config.get_value("Unlocks", "levels", [1]) print("加载成功") else: print("加载失败,使用默认数据")
三、额外提示
- 路径规范:永远用
user://存储存档,不要硬编码绝对路径,Godot会自动适配Windows、Mac、Linux、移动端等不同平台的合法存储目录。 - 防篡改处理:如果担心玩家修改存档,可以用
Crypto类做简单加密,比如XOR加密:
func encrypt_string(text: String, key: String) -> String: var result = "" for i in range(text.length()): result += chr(text[i].ord() ^ key[i % key.length()].ord()) return result
保存前加密JSON字符串,加载时解密再解析即可。
- 自动保存时机:在关卡完成、获得道具、退出游戏这类关键节点自动调用保存函数,避免玩家忘记手动保存的麻烦。
内容的提问来源于stack exchange,提问作者Coding_Guy
相关产品推荐
相关产品推荐

