Steamworks 文獻庫
逐步教學:成就
簡介
使用成就來獎勵達成某些里程碑,或以特定方式與您的遊戲互動的玩家。
整合程度
花費十分鐘,且少於十行程式碼。需要 Steamworks SDK 整合。

簡介

將成就作為鼓勵玩家在遊戲內進行互動或達成里程碑的獎勵方式。成就經常用來表揚擊殺次數、駕駛里程數、寶箱開啟數或其它遊戲內的常見行為,也可用於協助玩家在您的遊戲中探索不同的遊玩方式。成就解鎖後,將會在玩家視窗的角落彈出顯示,並在該玩家的成就頁面中標記。

隨著遊戲的擴展,您可以將成就整理成成就組合。組合可以讓您根據遊戲的需要將成就分門別類、新增 DLC 的成就而不影響遊戲主程式的完成進度,以及淘汰已移除內容的成就但不移除玩家已取得的成就。詳情請見下方的成就組合。

備註: 成就組合目前處於測試階段。我們將在測試期間持續進行改善,而本文也會隨之更新。

技術總覽

這份文獻將逐步帶領您在十分鐘以內於程式碼基底中,用十行以下的程式將非常基本的 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 及其 AppID
  4. 可選擇將組合標示為僅限開發者
  5. 儲存組合

若組合內沒有任何成就則不會對任何人顯示。

編輯組合

開啟組合的選單,選擇編輯組合來變更名稱、限制、僅限開發者狀態,或將其標示為已封存。

每個組合都會在編輯器內顯示其可見度:

可見度含義
可見玩家可見到此組合。
因限制而隱藏玩家尚無法見到此組合,例如此組合為僅限開發者,或遊戲的 DLC 尚未發行。
將於發佈後可見發佈變更後玩家就可見到此組合。

重新排序組合

點擊工具列中的變更組合順序,然後拖曳組合來選擇玩家會見到的組合順序。遊戲主程式組合無法移動。

刪除組合

開啟組合的選單,選擇刪除組合。必須先移動或刪除組合內的所有成就才可刪除組合。若想淘汰組合但不希望把玩家已取得的成就移除,可改用封存方式。

在組合之間移動成就

移動單一項成就,可直接在所屬組合欄位內進行變更。要同時移動多項成就,可使用批量移動:
  1. 點擊成就表格標頭中的批量移動
  2. 查看想移動的成就。選擇的成就數量會顯示在頁底
  3. 選擇目標組合,或選擇建立新組合…來建立一個
  4. 點擊移動
舉例來說,可開啟批量移動模式,使用搜尋欄位依 API 名稱篩選成就,然後勾選該欄標頭並選擇所有該組合內顯示的成就來進行移動。此流程相對簡單且省時。

移動成就若會對玩家造成影響,編輯器會提出警告:
  • 將成就從可見的組合移至隱藏或未推出的組合,會對已解鎖該成就的玩家隱藏成就
  • 將成就移動至玩家已有進度的組合可能會破壞那些玩家的全成就狀態

備註: 新增成就至已推出的組合不會破壞玩家的全成就狀態,但看起來可能不太自然。可考慮改為新增組合。

批量匯入 / 匯出

批量匯入 / 匯出分頁讓您以檔案格式管理成就:匯出 CSV 檔,在試算表工具中編輯,然後再附上圖示一起上傳。

步驟流程

  1. 點擊匯出定義(.csv)、匯出在地化內容(.csv)和 / 或匯出組合在地化內容(.csv)以下載目前的資料
  2. 編輯檔案。標頭列包含括號內對各欄的註解說明,如 spoiler(true 或 false)。上傳檔案時會忽略這些註解
  3. 將 .csv 檔和 .png 檔拖曳到上傳方框,或點擊選擇檔案…。可同時上傳多個檔案
  4. 檢查已上傳的檔案清單中是否有誤。移除檔案會取消該檔案的所有改動。若要取代檔案,先修正檔案後再重新上傳
  5. 檢查待處理的變更。在點擊儲存匯入的資料前不會儲存任何內容

如果遊戲尚未有任何成就,則匯出的定義與在地化檔案為包含數列開頭為 EXAMPLE_ 範例的範本。可打字輸入覆寫、刪除這些範例,或上傳目前範本以了解匯入流程的運作方式。

成就的 CSV 定義檔案

匯出為 <appid>-achievements-definitions.csv,每行定義一項成就。

欄說明
api_name必要且唯一。就是遊戲傳給 API 的名稱。
setid可選。既有組合的 ID。留空代表遊戲主程式組合。
permissionClient、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 在地化內容

匯出為 <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 位好友互相比較成就進度
  • 顯示每項成就的全球解鎖率,並特別標示稀有成就
  • 讓玩家可搜尋成就,並可用解鎖狀態或組合作為搜尋條件

您可以將玩家直接連結至您遊戲的成就:

網址顯示
https://steamcommunity.com/achievements/<AppID>遊戲的成就,不包括特定玩家的進度。不論玩家是否擁有遊戲均會顯示。

商店頁面

商店頁面的成就面板會顯示遊戲的所有成就,但排除會劇透以及已封存的成就。 DLC 商店頁面會顯示 DLC 組合內的成就。

個人檔案

玩家可在個人檔案內的成就展示欄中展示已完成的組合數量和全成就的遊戲數量,也能在完成任何遊戲的成就組合後在全成就達成者展示欄中特別突顯該遊戲。

最佳做法

  • 為新內容新增新組合。在玩家已完成的組合中加入成就可能會讓玩家感到困惑,因為該組合標示為已完成卻又有未解鎖的成就。為 DLC、更新或新模式等新內容建立新組合可讓玩家清楚了解成就進度
  • 封存而非刪除。若玩家已取得成就,將其封存而非刪除可讓玩家保有該成就
  • 使用 DLC 組合來包含 DLC 成就。如此即可與遊戲主程式的全成就進度分開,讓未擁有 DLC 的玩家不會因此而無法達成遊戲全成就
  • 組合名稱應簡潔易懂。組合名稱會在包括 Steam 用戶端等多處向玩家顯示
  • 為遊戲支援的所有語言將組合名稱在地化,使用組合在地化 CSV 檔或編輯器來進行
  • 先以僅限開發者的組合來測試之後再將新成就推出給玩家

常見問答

我需要更新遊戲或 Steamworks SDK 才能使用遊戲組合嗎?

不需要。組合是在 Steamworks 中設定的,您的遊戲使用與以前相同的 API 名稱和呼叫即可解鎖成就。

對我現有的成就會有什麼影響?

這些成就都在遊戲主程式組合中。若您未建立其它組合,玩家將在新的成就頁面中見到您的成就全部列在單一列表中。

如果我新增成就,玩家會失去成就完成進度嗎?

已完成組合的玩家將保持此狀態。然而,新增成就至已推出的組合表示尚未完成該組合的玩家會有更多需要完成的任務,因此我們建議為新內容建立新組合。

封存成就與刪除成就有什麼區別?

封存的成就對已解鎖的玩家仍可見,而尚未完成的玩家則不會計入進度。刪除的成就則會被完全移除。

我可在成就推出後將其移至另一個組合內嗎?

可以,但若移動成就會使已取得成就的玩家無法再看到,或會影響玩家的全成就狀態,則編輯器會發出警告。

我可以建立多少組合?

最多 40 個,包括遊戲主程式的組合在內。