Save Lite 是一个免费的,MIT 许可的保存系统插件,适用于 Godot 4.5 和更新版本(测试于 4.5.2 和 4.7.2)。您在检查器中勾选属性,调用两个函数,得到一个签名的、崩溃安全的、永远不会运行代码的保存槽,适用于桌面和 Web 构建。

一些背景:我开始的每个项目都以手写的 save_game() 结尾,逐渐变成了一道道的 spaghetti,我的 Web 构建也经常会打破它。因此,我创建了这个插件,决定分享它。

请注意:这是我的插件,我使用了大量的 AI(Claude Code)帮助我创建它。它写了大部分的代码和文档。然而,我决定了它应该做什么,审查了结果,并在 4.5.2 和 4.7.2 上,分别在 Windows 和 Web 构建上,运行了测试套件。

它是如何工作的:

  1. 在你要保存的东西下(玩家,宝箱,等等)添加一个 SaveLiteComponent 节点。
  2. 在检查器中勾选属性(位置,健康,硬币等等)。无法保存的东西会以灰色显示,原因会显示。
  3. 然后:```
    gdscript
    var code: int = await SaveLite.save_slot("slot1") # 后面

后面

var code: int = await SaveLite.load_slot("slot1")
`` 设置,如音量,放入set_global/get_global` 中,如果某些数据不存储在节点上,可以注册一个小对象,带有两个方法。

我关注了以下几点:

  • 保存文件是纯 JSON,永远不会被加载为对象,因此,分享的保存文件无法在你的游戏中运行代码。
  • 文件是签名的,因此,损坏或手动编辑的文件会被拒绝,而不是部分加载。
  • 不是反作弊的,游戏中的密钥会被发送。
  • 在桌面上,它会先写入临时文件,因此,崩溃中保存不会清除槽。
  • 在 Web 构建中(IndexedDB),你只需要 await 每个调用。
  • 仅使用 GDScript,未依赖任何库或网络功能。

它不做以下几件事情:

  • 只有一个保存槽(加上全局值),因此适合于竞技游戏,益智游戏或简单的“继续”按钮。
  • 没有自动保存,场景状态,自定义资源类型,C# API。

一些人可能会问的问题:

  • 为什么不使用 ResourceSaver? 加载一个 .tres 文件从未信任的文件中可能会运行嵌入的脚本。因此,我选择了纯值。
  • Godot 4.4 或更早版本? 不支持,因为它是基于 4.5 API 的。
  • 如果我需要更多槽位? 我也有一版付费版,有更多功能,它可以读取 Lite 保存,因此,使用 Lite 不会锁定你。然而,Lite 是独立完成的。

链接:https://cardeiro-studio.itch.io/save-lite

反馈非常欢迎,特别是检查器工作流和我没有测试的浏览器。bug 报告也很有帮助。