Steamworks 文献库
分步指南:成就
简述
使用成就来奖励到达特定里程碑的玩家,或以特定方式和您的游戏互动的玩家。
整合水平
10 分钟且代码少于 10 行。需要 Steamworks SDK 集成。

简介

成就可以用来鼓励并奖励您玩家在您游戏中的互动和取得的里程碑。成就通常用来记录您游戏中的击杀数、里程数、开箱数或其他常见行为。同时也可以用来帮助玩家发现游玩您游戏的不同方式。解锁后,这些成就将会在玩家窗口的角落弹出,并会在该玩家的成就页面上标示。

随着游戏不断得到开发,您可以将当中的成就整理为成就集合。通过成就集合,您可以按照对游戏有意义的方式对成就进行分组,为 DLC 添加成就而不影响基础游戏的完成情况,并可停用已移除内容的成就,而已经获得成就的玩家仍可保留这些成就。详情请见下方的成就集合部分。

注意: 成就集合功能目前尚处于测试阶段。我们将在测试期间持续进行改进,本文档也会随着情况的变化而得到更新。

技术概览

本文是一份快速指南,逐步指导您在 10 分钟内,对您的代码库添加 10 行以内的代码,将非常基础的 Steam 成就整合到您的应用程序中。 Steamworks SDK 中有一个名为 Spacewar 的绝佳应用程序示例,完整展示了 Steam 全部功能。如要了解 Steam 全部功能的实际运行情况,请首先访问此处。本教程将 Spacewar 和统计与成就 API 中的信息简化至 Steam 统计最基本必要的数据,让教程尽量简单明了。请注意,统计和成就之间有很多重叠的部分,所以如果您要两者一起整合,别忘了很多调用都可以合并使用。

集合完全是在 Steamworks 中配置的。集合不需要任何额外代码,您的游戏在解锁集合中的成就时,使用的是与本指南的描述中相同的 API 名称和调用。

第一步 - 设定游戏的成就

成就因各应用程序而异,需要在后端的 Steamworks 应用程序管理的成就配置页面进行设置。以下是 Steamworks 的示例应用 Spacewar 的成就列表:

spacewar_achievement_examplescreenshot.jpg

访问成就编辑器

成就的创建和管理在成就编辑器中进行:
  1. 在您应用的 Steamworks 登陆页上,选择编辑 Steamworks 设置。
  2. 选择统计与成就 > 成就。
  3. 点击页面顶部的横幅以打开新版成就编辑器。

您需要编辑应用信息的权限才能使用成就编辑器。

编辑器包含两个选项卡:
  • 管理成就 - 创建、编辑和整理您的成就集合与成就。
  • 批量导入/导出 - 将您的成就以 CSV 文件的形式导出或导入,并批量上传图标。请参阅下方的批量导入/导出部分。

编辑器顶部会显示您游戏已使用的成就数与集合数以及相应的上限,并提供了在自己的成就页面上预览成就的链接。

创建和编辑成就

除非您将成就分配到其他集合,否则所有成就都将属于基础游戏成就集合。要创建成就,请在该成就应隶属的成就集合中点击创建成就。要编辑成就,请在成就表中选择该成就。

字段描述
API 名称您游戏传递给 Steamworks API 的独一无二的名称,例如 ACH_WIN_ONE_GAME。必需。
显示名称显示给玩家的成就名称。可本地化。
描述显示给玩家的成就描述。可本地化。
图标“已达成”图标和“未达成”图标。请参阅下方的图标部分。
设置者谁可以解锁该成就:客户端、游戏服务器或官方游戏服务器。
进度统计(可选)用于显示此成就进度的统计数据,以及映射到 0% 和 100% 进度的统计数据范围。
可见性可见,或剧透,后者用以在成就解锁之前隐藏其详细信息。
可选状态可用,如果该成就已不可再取得,则为已归档。
在集合中成就所属的集合。

成就表还显示了每个成就的 ID、所属集合、设置者,及其全球解锁率。使用工具栏中的筛选条件框,按名称、描述或 API 名称查找成就。

删除成就将对所有人移除该成就,包括已解锁该成就的玩家。如果某个成就已被玩家取得,编辑器会建议改为将其归档。请参阅下方的归档部分。

图标

为达到最佳效果,成就图标应该为 256x256 像素的 PNG 格式图片。也可以小至 64x64,但推荐使用较大的图标。图标必须为正方形,图标尺寸如果过大,将被缩小至 256x256。也接受 JPG 格式的图片。

我们推荐已达成的成就使用彩色图标,未达成的成就以灰度显示图标。您无需自行创建“未达成”图标:只需在成就编辑器中点击生成,或在批量上传时使用自动生成“未达成”图标选项,即可从“已达成”图标创建灰度“未达成”图标。您可以随时用自己的图标替换生成的图标。

本地化

使用工具栏中的语言选择器,查看和编辑您游戏各语言版本的成就。当某些语言缺少本地化文本时,工具栏中会显示警告图标,,此外每个缺少文本的成就或集合也会在编辑器中标出。

要选择您的成就支持哪些语言,请点击工具栏语言旁边的编辑按钮,或点击批量导入/导出选项卡中的配置语言。这些语言将用于编辑器和本地化 CSV 文件。当您通过 API 查询成就时,Steam 会返回所请求语言的文本。

上限

项目上限
每个应用的成就数5,000(尚未通过审核的应用为 100)
每个应用的成就集合数40,包括基础游戏成就集合

已归档的成就计入成就数量上限。

第二步 - 封装成就作业

以下代码独立于游戏存在,可在合适的地方添加至游戏当中。此类代码已可正常运行,但也可轻易扩展,满足更多需求。所有的程序代码都是直接从 Spacewar 示例文件 StatsAndAchievements.cpp/h 中获取的。

头文件

首先我们需要定义一个结构体,以存储从 Steam 接收的成就数据,并提供一个宏来创建该类型的对象。这些数据直接与成就配置页面上的内容相对应。
#define _ACH_ID( id, name ) { id, #id, name, "", 0, 0 } struct Achievement_t { int m_eAchievementID; const char *m_pchAchievementID; char m_rgchName[128]; char m_rgchDescription[256]; bool m_bAchieved; int m_iIconImage; };

接下来,定义一个帮助程序类,用来包装所有 Steam 统计 API 的调用并建立所有 Steam 回调。
class CSteamAchievements { private: int64 m_iAppID; // 我们当前的 AppID Achievement_t *m_pAchievements; // 成就数据 int m_iNumAchievements; // 成就数量 bool m_bInitialized; // 是否已准备好要使用该 API? public: CSteamAchievements(Achievement_t *Achievements, int NumAchievements); ~CSteamAchievements(); bool Initialize(); bool SetAchievement(const char* ID); STEAM_CALLBACK( CSteamAchievements, OnUserStatsStored, UserStatsStored_t, m_CallbackUserStatsStored ); STEAM_CALLBACK( CSteamAchievements, OnAchievementStored, UserAchievementStored_t, m_CallbackAchievementStored ); };

代码文件

构造函数

参数 - 构造函数使用指针来指向成就数组和数组的长度。后文中将与主要游戏代码一起对数组的格式进行说明。
返回 - 不适用
作用 - 此构造函数会初始化几个成员变量,并抓取目前运行的 AppID。除此之外,它还会和处理对 Steam 的异步调用的回调方法挂钩。最后,它会对 Initialize() 进行初次调用以检查该 API 是否已准备就绪。
CSteamAchievements::CSteamAchievements(Achievement_t *Achievements, int NumAchievements): m_iAppID( 0 ), m_bInitialized( false ), m_CallbackUserStatsStored( this, &CSteamAchievements::OnUserStatsStored ), m_CallbackAchievementStored( this, &CSteamAchievements::OnAchievementStored ) { m_iAppID = SteamUtils()->GetAppID(); m_pAchievements = Achievements; m_iNumAchievements = NumAchievements; m_bInitialized = Initialize(); }

Initialize()

参数 - 无
返回 - 代表调用是否成功的 bool 。如果调用失败,很可能是因为 Steam 尚未初始化。进行此调用时请确定 Steam 客户端已开启,而且已调用了 SteamAPI_Init。
作用 - 确保 Steam 已载入,且已有用户登录的上下文。
bool CSteamAchievements::Initialize() { // Steam 是否已加载?如果没有,我们就无法获得统计数据。 if ( NULL == SteamUserStats() || NULL == SteamUser() ) { return false; } // 用户是否登录?如果没有,我们就无法访问统计数据。 if ( !SteamUser()->BLoggedOn() ) { return false; } return true; }

SetAchievement()

参数 - 您要设置的成就的字符串标识符(如“ACH_WIN_ONE_GAME”)。
返回 - 代表调用是否成功的 bool。如果调用失败,则 Steam 尚未初始化。
作用 - 此方法将给定成就设置为已达成,并将结果发至 Steam。您可多次设定同一项给定成就,这样就不用担心只能设定尚未设置的成就了。此调用为异步调用,会触发两个回调:OnUserStatsStored() 与 OnAchievementStored()。
bool CSteamAchievements::SetAchievement(const char* ID) { // 我们是否已经从 Steam 收到回调? if (m_bInitialized) { SteamUserStats()->SetAchievement(ID); return SteamUserStats()->StoreStats(); } // 如果没有,那么我们还不能设置成就 return false; }

OnUserStatsStored()

参数 - 不适用
返回 - 无
作用 - 此方法是每次尝试在 Steam 上存储统计时进行的回调。
void CSteamAchievements::OnUserStatsStored( UserStatsStored_t *pCallback ) { // 我们可能会收到其他游戏统计数据的回调,忽略它们 if ( m_iAppID == pCallback->m_nGameID ) { if ( k_EResultOK == pCallback->m_eResult ) { OutputDebugString( "Stored stats for Steam\n" ); } else { char buffer[128]; _snprintf( buffer, 128, "StatsStored - failed, %d\n", pCallback->m_eResult ); OutputDebugString( buffer ); } } }

OnAchievementStored()

参数 - 不适用
返回 - 无
作用 - 此方法是每次在 Steam 上成功存储成就时进行的回调。
void CSteamAchievements::OnAchievementStored( UserAchievementStored_t *pCallback ) { // 我们可能会收到其他游戏统计数据的回调,忽略它们 if ( m_iAppID == pCallback->m_nGameID ) { OutputDebugString( "Stored Achievement for Steam\n" ); } }

第三步:与游戏整合

以下是您需要整合至游戏中适当位置的代码段的完整列表。

定义和全局

以下包含了建立成就需要的数据、游戏专属成就的枚举,和一个指向帮助程序对象的指针。请注意,这须与 Steamworks 管理页面上的成就相符。
... #include "steam_api.h" // 定义我们的成就 enum EAchievements { ACH_WIN_ONE_GAME = 0, ACH_WIN_100_GAMES = 1, ACH_TRAVEL_FAR_ACCUM = 2, ACH_TRAVEL_FAR_SINGLE = 3, }; // 成就数组,用于保存有关成就及其状态的数据 Achievement_t g_Achievements[] = { _ACH_ID( ACH_WIN_ONE_GAME, "Winner" ), _ACH_ID( ACH_WIN_100_GAMES, "Champion" ), _ACH_ID( ACH_TRAVEL_FAR_ACCUM, "Interstellar" ), _ACH_ID( ACH_TRAVEL_FAR_SINGLE, "Orbiter" ), }; // 成就对象的全局访问 CSteamAchievements* g_SteamAchievements = NULL; ...

初始化

调用 SteamAPI_Init 可以全面初始化 Steam,且必须先于任何其他调用。如果成功,便可传入成就数组和数组大小来建立帮助程序对象。
... // 初始化 Steam bool bRet = SteamAPI_Init(); // 如果 Steam 成功初始化,则创建 SteamAchievements 对象 if (bRet) { g_SteamAchievements = new CSteamAchievements(g_Achievements, 4); } ...

回调处理

为了确保处理到所有 Steam 回调,我们需要定期轮询以获取新的消息。将此调用加入游戏循环即可达到效果。
... SteamAPI_RunCallbacks(); ...

触发成就

触发成就非常简单,只需进行一次调用,传入成就标识符即可。
... if (g_SteamAchievements) g_SteamAchievements->SetAchievement("ACH_WIN_100_GAMES"); ...

注意: Steam 不会为无法玩某个 DLC 的玩家解锁该 DLC 成就集合中的成就,也不会解锁已归档的成就集合中的成就。请确保您的游戏只会向拥有该 DLC 的玩家授予 DLC 成就,并停止授予已经归档的成就。请参见下方的成就集合部分。

关闭

对 SteamAPI_Shutdown 的调用可能已存在于您的代码中。此调用将关闭 Steam,且必须在应用程序退出之前调用。最后,我们需要删除先前建立的帮助程序对象。
... // 关闭 Steam SteamAPI_Shutdown(); // 删除 SteamAchievements 对象 if (g_SteamAchievements) delete g_SteamAchievements; ...

第四步:测试和故障排除


若要在不为您的游戏添加代码的情况下设置或清除统计或成就,您可以使用 Steam 客户端控制台。使用“steam.exe -console”运行,然后:
  • achievement_clear <appid> <成就名称>
  • reset_all_stats <appid>

预览与发布

您在成就编辑器中所做的变更会保存到您应用的配置草稿中。要使这些成就上线,只需采取和其他任何 Steamworks 设置一样的操作,即在编辑 Steamworks 设置中的发布选项卡中发布您的变更。

在发布之前,您可以在您自己的 Steam 成就页面上预览您的成就,该页面的链接位于编辑器顶部。使用仅限开发者的集合,可以在不对玩家公开的情况下测试新成就。

要完全启用成就并完成您的发行核对清单,您还需要在商店面的“基本信息”中,勾选支持功能下的 Steam 成就选项。要通过发行核对清单审核,每个成就必须在您已配置的每种语言中都拥有名称,且必须拥有图标。

成就集合

成就集合可让您将游戏的成就按照已命名的组整理,按集合跟踪玩家的完成情况,并逐步地添加或停用成就,而已经获得成就的玩家仍可保留这些成就。通过成就集合,您可以:
  • 按照对您的游戏有意义的方式(例如按模式、角色、章节或事件)对成就进行分组。
  • 为只会计入 DLC 拥有者完成情况的 DLC 添加成就。
  • 为已停用的内容归档成就和成就集合,同时不会把玩家已获得的成就移除。
  • 在对玩家隐藏的、仅限开发者的集合中创建并测试成就。
  • 使用 CSV 和图片文件批量管理成就定义、集合分配、图标以及本地化。

基础游戏成就集合

每款游戏都有一个基础游戏成就集合。未分配到其他集合的成就将属于基础游戏成就集合,因此如果您没有创建任何其他集合,您所有的成就都将位于基础游戏成就集合中。对于大多数游戏来说,此集合将包含您大部分的成就。

基础游戏集合无法重命名、删除或重新排序。它始终会优先显示,除非其中不含任何内容——在这种情况下,该集合将不会显示(但仍会计入上限)。

自定义集合

您可以创建其他成就集合来整理您的成就。每个集合都有一个显示给玩家的名称,以及一个可选的限制条件:

限制条件谁可以取得该集合中的成就
游戏的所有玩家任何可以玩该游戏的人。
(DLC 的) 所有者仅限可以玩所选 DLC 的玩家。

玩家可以看到每个成就集合的进度,成就集合的完成进度与游戏其余成就的进度会分别跟踪。

DLC 成就集合

仅限 DLC 所有者达成的集合即为 DLC 成就集合。 DLC 成就集合的特点如下:
  • 可在游戏的成就页面上供所有玩家探索,但只有能玩该 DLC 的玩家才能取得这些成就。
  • 不计入基础游戏成就集合或其他任何集合的完成情况。
  • 在 DLC 发行前一直对玩家隐藏。这样您就可以在即将推出的 DLC 上线前为其配置并测试成就。
  • 在成就页面上使用 DLC 的商店艺术作品和商店链接。如果 DLC 没有已发布的商店页面,则会改用基础游戏的艺术作品和商店链接,且编辑器会提醒您这一点。
  • 会显示在 DLC 商店页面的成就面板中。

集合名称将以“DLC”前缀显示,因此您无需在名称中自行包含“DLC”字样。

仅限开发者的集合

标记为仅限开发者的集合仅对该应用的开发者可见,无论该应用是否已发行。只有开发者才能解锁仅限开发者的集合中的成就。仅限开发者的集合对于新成就准备推出之前的创建和测试工作非常有用。

归档

有时游戏模式会被替换、季节性活动会结束,或某项成就将无法再取得。此时您不必删除玩家已取得的成就,而是可以将其归档。
  • 已归档的成就对已解锁该成就的玩家仍然可见,且仍可在其个人资料中展示。未解锁已归档成就的玩家将无法看到该成就,且该成就不会计入其所属集合的完成情况中。
  • 已归档的成就集合仅对之前解锁过其中成就的玩家可见。已归档成就集合中的任何成就均无法解锁。解锁过已归档成就集合中成就的玩家仍可以查看该集合中的所有成就。

归档不会改变您的游戏。归档成就时,请确保您的游戏不会再授予该成就。

剧透成就

之前标记为已隐藏的成就现在称为剧透成就。为避免剧透您的游戏,剧透成就的名称和描述在玩家解锁该成就或选择显示之前不会向玩家显示。剧透成就和已归档的成就不会显示在商店页面的成就面板中。

完成情况

完成情况是按集合分别跟踪的:
  • 玩家通过解锁一个成就集合中所有仍然可用的成就来完成该集合。玩家尚未解锁的已归档成就不是必需的。
  • 玩家一旦完成某个集合,该集合将始终保持已完成状态,即使您之后又向该集合添加了成就也是如此。
  • DLC 成就集合仅在玩家拥有该 DLC 时才计入其完成情况。

玩家可以在其 Steam 个人资料中展示自己完成了多少游戏和成就集合。当玩家完成游戏的任意一个成就集合后,该游戏即有资格在其个人资料的“完满主义者展柜”中展示。

创建集合

  1. 在管理成就选项卡中,点击创建新集合。
  2. 输入集合名称。该名称是对玩家显示的。
  3. 在限制下,选择游戏的所有玩家,或选择一个 DLC,以使该集合仅对该 DLC 的拥有者开放。 DLC 列表包含了为您游戏列出的 DLC 及其 App ID。
  4. 此外,您还可以选择将该集合标记为仅限开发者。
  5. 保存集合。

没有成就的集合不会对任何人显示。

编辑集合

打开集合的菜单,选择编辑集合,对其名称、限制、仅限开发者的状态进行修改,或将其标记为已归档。

每个集合都会在编辑器中显示其可见性:

可见性含义
可见玩家可以看到此集合。
因限制而隐藏玩家尚无法看到此集合,原因举例而言可能是该集合为仅限开发者的集合,或其对应的 DLC 尚未发行。
将在发布后可见您发布变更后,玩家就能看到此集合。

为集合重新排序

在工具栏中点击为集合重新排序,然后拖放您的集合以选择玩家看到它们的顺序。基础游戏成就集合不能移动。

删除集合

打开该集合的菜单并选择删除集合。您必须先移动或删除一个集合中的所有成就,然后才能删除该集合。如果您想停用一个集合,同时不会移除玩家已获得的成就,请改为将其归档。

在成就集合之间移动成就

要移动单个成就,请更改其在集合中字段。要一次移动多个成就,请使用批量移动:
  1. 在成就表的标头中点击批量移动。
  2. 选中要移动的成就。已选成就的数量将显示在页面底部。
  3. 选择一个目标集合,或选择创建新集合…来创建一个。
  4. 点击移动。
例如,您可以开启批量移动模式,使用搜索框按 API 名称筛选成就,然后点击纵列标头中的复选框以选择某个组中所有可见的成就,从而将其移动。此工作流程相对简单,可以节省不少时间。

编辑器会在您做出可能影响玩家的移动操作前发出警告:
  • 将成就从可见集合移动到隐藏或未发布集合,将导致已解锁该成就的玩家看不到这些成就。
  • 将成就移动到玩家已有进度的成就集合中,可能会扰乱这些玩家的完成情况。

注意: 将成就添加到已发布的成就集合中不会破坏玩家的全成就达成状态,但可能无法正常显示。请考虑改为添加一个新集合。

批量导入/导出

批量导入/导出选项卡允许您将成就作为文件进行管理:导出 CSV 文件,在电子表格工具中对其进行编辑,然后连同图标一起重新上传。

工作流程

  1. 点击导出定义(.csv)、导出本地化(.csv)和/或导出集合本地化 (.csv),以下载您当前的数据。
  2. 编辑文件。标头行包含了置于括号内的说明,对每一列进行了表述,例如剧透(true 或 false)。上传文件时将忽略这些说明。
  3. 将 .csv 和 .png 文件拖放到上传框中,或点击选择文件…。您可以一次上传多个文件。
  4. 检查已上传文件列表,看是否有任何错误。删除文件会撤销其带来的所有改动。要替换文件,请先更正文件,然后重新上传。
  5. 查看待处理变更。在您点击保存导入的数据之前,不会保存任何内容。

如果您的游戏尚未设置任何成就,那么导出的定义和本地化文件将是模板文件,其中包含了几个示例行,并以 EXAMPLE_ 开头。您可以覆写、删除这几行,也可以原封不动地上传该模板以了解导入功能的运作方式。

成就定义 CSV

导出为 <appid>-achievements-definitions.csv。每一行定义一个成就。

列描述
api_name必需,唯一。您游戏传递给 API 的名称。
setid可选。现有集合的 ID。若为基础游戏成就集合,请留空。
permission为 Client、GameServer 或 OfficialGameServer 三者之一。
spoilertrue 或 false。
archivedtrue 或 false。
progress_stat_name可选。现有的某项统计数据的名称,用于进度条。若无进度条,请留空。
progress_stat_min数值,不低于该统计数据自身的最小值。如果统计数据为整数值,则此值必须为整数。
progress_stat_max数值,大于 progress_stat_min 且不高于该统计数据自身的最大值。如果统计数据为整数值,则此值必须为整数。

当您上传定义 CSV 文件时,其中的成就会按照 API 名称与您现有的成就进行比较:
  • 添加 - 与现有 API 名称不符的行将被添加为新成就。如果您是想重命名现有成就的 API 名称,请先在编辑器中进行修改,否则旧数据将被删除。
  • 修改 - 值已更改的现有成就将得到更新。
  • 未修改 - 值未更改的现有成就将保持不变。
  • CSV 中缺失 - 不在文件中的现有成就将被保留,除非您勾选删除这些成就。删除成就时请谨慎,因为成就一旦被删除,便无法再轻易地添加回去。

注意: 成就名称和描述并非定义 CSV 文件的一部分。请使用本地化 CSV 来对其进行设置。

注意: 进度统计数据必须已经存在,且必须与成就具有相同的权限。在创建新的统计数据前,请先进行编辑。

成就本地化 CSV

导出为 <appid>-achievements-localization.csv。每个成就都有两行:名称一行,描述一行。

列描述
api_name必需。必须与定义 CSV 中的或现有成就的 api_name 相符。此处的 API 名称区分大小写。
fieldname 或 description。
(每种语言一列)该语言(例如 english、french、german)的文本。

各语言列与您为成就配置的语言相匹配。如果您刚开始进行本地化,请先配置您的语言,以便导出的 CSV 文件包含这些语言列。

如果您同时上传定义 CSV 文件和本地化 CSV 文件,则定义 CSV 文件中缺失的成就的本地化内容将不会被更新。

集合本地化 CSV

导出为 <appid>-achievement-sets-localization.csv。每行包含一个集合的名称。

列描述
setid必需。现有集合的 ID。
(每种语言一列)该语言的集合名称。 english 为必填项。

您必须先在编辑器中创建集合,然后才能在此处对其进行本地化。基础游戏成就集合不能重命名。

图标文件

用成就 API 的名称为图标文件命名,后跟 _ACHIEVED 或 _UNACHIEVED,例如 LEVEL_20_ACHIEVED.png 和 LEVEL_20_UNACHIEVED.png。图标会自动分配给匹配的成就。

勾选自动生成“未达成”图标,自动从上传的任何“已达成”图标创建灰度“未达成”图标。

如果您在上传图标的同时也上传了定义 CSV 文件,图标只会分配给该 CSV 文件中包含的成就。若要单独上传图标,请勿包含定义 CSV 文件。

玩家看到的内容

成就页面

玩家可以在 Steam 成就页面、Steam 客户端和 Steam 社区网站上看到您的成就。成就页面会:
  • 显示每个集合(包括 DLC 成就集合)的进度和完成状态。
  • 让玩家与最多 3 位好友比较成就。
  • 显示每个成就的全球解锁率,并突出显示稀有成就。
  • 允许玩家搜索成就,并按解锁状态或所属集合进行筛选。

您可以直接向玩家提供您游戏成就的链接:

URL显示
https://steamcommunity.com/achievements/<appid>您游戏的成就,不包含特定玩家的进度。无论玩家是否拥有该游戏均可使用。

商店页面

商店页面上的成就面板会显示您游戏中的成就,但不包括剧透成就和已归档的成就。 DLC 商店页面会显示该 DLC 成就集合中的成就。

个人资料

玩家可以在其个人资料的“成就展柜”中展示自己完成的游戏和成就集合数,且在完成某款游戏的任意成就集合后,就可以在“完满主义者展柜”中展示该游戏。

最佳实践

  • 为新内容添加新的成就集合。向玩家已完成的成就集合中添加新成就可能会让玩家感到困惑,因为该成就集合会被标记为已完成,但其中却存在未解锁的成就。为新内容(例如 DLC、游戏更新或新模式)创建新的成就集合可让玩家对成就进度有一个清晰的认识。
  • 归档而非删除。如果玩家已取得某项成就,请将其归档而非删除,以便玩家保留曾取得的成就。
  • 为 DLC 成就使用 DLC 成就集合。这样可以使基础游戏的完成情况与之分开,以免不拥有该 DLC 的玩家无法完成您的游戏。
  • 集合名称应言简意赅。集合名称会在许多地方展示给玩家,包括在 Steam 客户端中。
  • 为您游戏支持的每种语言都提供本地化集合名称,可以使用集合本地化 CSV 文件或编辑器进行操作。
  • 在向玩家发布新成就之前,请使用仅限开发者的集合进行测试。

常见问题

我是否需要更新我的游戏或 Steamworks SDK 才能使用成就集合?

不是。集合在 Steamworks 中进行配置,您的游戏会使用与之前相同的 API 名称和调用来解锁成就。

我现有的成就会受到什么影响?

它们都在基础游戏集合中。如果您不创建任何其他集合,玩家将在新的成就页面上看到您的成就以单一列表形式呈现。

如果我添加新成就,玩家会丢失其成就完成情况吗?

已完成某个成就集合的玩家将保留该完成状态。但是,向已发布的成就集合添加新成就,意味着尚未完成该成就集合的玩家有了更多需要完成的任务,因此我们建议为新内容添加新的成就集合。

归档和删除成就有什么区别?

已归档的成就对已解锁该成就的玩家仍然可见,但对未解锁该成就的玩家而言,将不再计入其完成情况。删除的成就将对所有人移除。

发布成就后,我可以将其移动到其他成就集合中吗?

可以,但如果移动有可能导致已取得该成就的玩家无法看到它,或影响玩家的完成情况,编辑器会发出警告。

我可以创建多少个集合?

最多 40 个,包括基础游戏成就集合。