跳转到主要内容
在 XBOX Game Development Kit(GDK)与 Steam 中,成就都包含名称、说明、图标、以及是否已为当前用户解锁,并可选地包含完成成就的进度。Steam 还提供了 stats API,游戏可用它将用户进度与预设目标比较,并在超过目标时解锁成就。 事实上,XBOX Game Development Kit(GDK)提供了两套成就 API:基于事件(先前称为 Achievements 2013)与 作品管理型(先前称为 Achievements 2017)。两种系统都是可行选择,但如果你从 Steam 迁移过来,游戏管理的成就/stats 会更熟悉,也更容易与游戏中已有的逻辑对齐。因此,本主题聚焦介绍该 API。有关两种 API 差异的更多信息,参见 基于事件与游戏管理的成就。以下各节介绍 Steamworks API 与 XBOX Game Development Kit(GDK)在成就方面的差异。 要使用游戏管理的成就 API,你需要创建一个 XBOX 服务上下文句柄。这可以通过 XblContextCreateHandle 函数,并配合 XUserAddResult API(参见 用户身份验证与所有权 主题)中的 XUserHandle 完成。

跟踪成就进度

在 Steam API 中,你可以使用 ISteamUserStats::GetStat/ISteamUser::SetStat API 跟踪用户朝某个成就的进度,并让 Steam Stats API 中存储的值成为当前进度值的真源。 而在游戏管理的成就中,你的游戏是唯一真源,必须自行跟踪用户当前的进度。通过 API 调用在云端更新当前进度更像是一次“check in”,用于在 XBOX 生态的多个位置显示用户进度。关于当前进度值应存储在哪里,没有固定指导:许多游戏选择将其存储在存档文件中(也保存在云端),另一些则可能存储在自己的后端服务上。请务必让云端与游戏内部统计管理系统之间的值保持同步。

枚举所有成就

要使用 Steamworks API 获取用户的所有 stats,你通常会调用 ISteamUserStats::RequestUserStats 从服务器拉取最新 stats。相应的回调触发后,你可以按 API 名称遍历每个成就,使用 ISteamUserStats::GetStat/ISteamUserStats::GetAchievement 函数,并用返回数据初始化游戏状态。 在 XBOX Game Development Kit(GDK)中,你可以使用 XblAchievementsGetAchievementsForTitleIdAsync,然后使用 XblAchievementsResultGetAchievements 的 Out 参数中数组内每个成就对象的数据初始化游戏状态。每个成就以 XblAchievement 结构体提供。有关其数据的更多信息,参见 其参考主题。

Steamworks

XBOX Game Development Kit(GDK)

有关游戏管理的成就的更多信息,参见 获取游戏管理的成就。

更新成就进度与解锁成就

在 XBOX Game Development Kit(GDK)与 Steam 中,由游戏代码决定何时解锁成就。在 XBOX Game Development Kit(GDK)中,将成就的进度设为 100 即会解锁它。以下各节说明使用两种 API 更新用户指定成就进度所需的步骤。 以下是在两种 SDK 中实现的 UpdateAchievement 方法代码示例,它接收成就 ID / API 名称(Steam 中还需 stat API 名称)、成就要增加的量、解锁该成就的目标值,并相应地更新进度与解锁状态。

Steamworks

XBOX Game Development Kit(GDK)

有关游戏管理的成就的更多信息,参见 更新游戏管理的成就。

离线成就

解锁 XBOX 成就不需要网络连接。如果用户未连接到 XBOX 网络,之后会自动与服务器同步解锁,无需额外代码。

获取其他用户的成就

要获取其他用户的成就,可以调用 XblAchievementsGetAchievementsForTitleAsync/XblAchievementsGetAchievementAsync 函数,并传入你要获取成就的用户的 XBOX 用户 ID(XUID)。这类似于在 Steam 中使用 ISteamUser::RequestUserStats、ISteamUserStats::GetUserStat 与 ISteamUserStats::GetUserAchievement。

重置成就

与 Steamworks API 的 ISteamUserStats::ResetAllStats 不同(它可用来重置用户所有 stats 的进度,并可选地重置成就),XBOX Game Development Kit(GDK)没有以编程方式重置成就进度或解锁状态的公开能力。以进度值 0 调用 XblAchievementsUpdateAchievementAsync 会保持进度值不变。不过,在测试期间你可以使用 玩家数据重置工具(XblPlayerDataReset.exe) 来完成此操作。

速率限制

更新成就进度时,注意不要过于频繁地调用 XBOX Services API(XSAPI),否则可能触发游戏的速率限制,导致意外行为并影响用户体验。 对于跟踪高频更新 stats 的成就,可以考虑批量 API 调用 —— 累计一定事件数或在特定时间间隔后再向服务器同步。 你可以使用 XBOX 服务 Trace Analyzer(XblTraceAnalyzer.exe) 调试 API 调用。 有关 XBOX 服务速率限制的更多信息,参见 细粒度速率限制。
最后修改于 2026年10月19日