For the complete documentation index, see llms.txt. This page is also available as Markdown.

保存系统

保存系统提供了一个键值数据存储系统,用于在不同会话之间持久保存玩家进度和偏好。

Save 系统是一个简单的 键值存储。你给它一个字符串键(例如 "xp"),它会存储一个值,等玩家下次加入时它仍然会在那里。

有两种保存数据:

  • 玩家保存:某个玩家的个人数据(XP、升级、设置、背包等)

  • 全局保存:游戏中所有人共享(世界纪录、服务器设置、全局计数器等)

快速开始(保存 + 读取一个属性)

最常见的模式是:

  • 在……中加载已保存的值 ao_start

  • 每当值变化时再次保存

Player :: class : Player_Base {
    xp: s64;
    level: s64;

    ao_start :: method() {
        // 新玩家会使用默认值
        xp    = Save.get_int(this, "xp", 0);
        level = Save.get_int(this, "level", 1);
    }
}

add_xp :: proc(player: Player, amount: s64) {
    player.xp += amount;

    // ... 这里写你的升级逻辑 ...

    // 值变化时立即保存
    Save.set_int(player, "xp", player.xp);
    Save.set_int(player, "level", player.level);
}

玩家保存(按玩家区分的数据)

玩家保存仅作用于单个玩家。每个玩家都有自己独立的键/值数据。

支持的类型:

  • 字符串: Save.set_string / Save.get_string

  • 整数(s64): Save.set_int / Save.get_int (注意:当前值在内部会被截断为 32 位)

  • 浮点数(f64): Save.set_f64 / Save.get_f64

  • JSON(高级): Save.set_json / Save.try_get_json

读取时总是提供一个合理的默认值。新玩家还没有这些键,而且 get_* 会返回你的默认值。

保存“更大”的数据(JSON)

如果你有一小组字段(比如进度 + 已解锁内容),通常把它保存成一个 JSON 整体会更好。

只有标记为 @ao_serialize 的字段会被保存。

Save.try_get_json 返回 false 如果键不存在或 JSON 字符串格式错误,则返回 false。加载前先分配类数据,因为 false 分支不会分配它。缺失的字段会保持其类默认值,未知字段会被忽略。

保存版本控制(安全迁移旧数据)

如果你以后更改保存格式,请保留一个 version 键,并将较旧的保存数据向前迁移。

全局保存(所有人共享)

全局保存在整个游戏范围内共享,而不是按玩家区分。

使用 Save.increment_game_int 适用于多个玩家可能同时更新的计数器(击杀数、加入数、已玩回合数等)。它的 optimistic_update 参数默认值为 true,因此本地缓存值会立即改变。

常见模式

布尔值

将布尔值保存为 0/1:

键命名

键本质上只是字符串,所以要选择以后不会冲突的名称:

  • "xp", "level", "selected_skin"

  • "tycoon.cash", "tycoon.upgrades.mouth_level"

如果有多个游戏通过游戏父子关系连接(中心 + 小游戏),请参见 跨游戏产品/数据 了解保存数据如何共享。

其他 API

ordered_getordered_get_all 它们是异步的,并在服务器上执行。请从正常的共享游戏流程中调用它们;不要添加 Game.is_server() 保护条件。

回调数组仅在回调期间有效,所以请复制你需要保留的任何条目:

请求都会调用一次其回调。缺失的条目或请求失败会返回提供的默认值。每个完成的 ordered_get 请求也都会调用一次其回调;空结果或请求失败会提供一个空数组。请求失败会被记录。 ordered_get_all 请求也都会调用一次其回调;空结果或请求失败会提供一个空数组。请求失败会被记录。

最后更新于