😺

Unity製ゲームでSteam実績を実装する話2023

2023/06/23に公開

はじめに

Steamのゲームでよくある実績機能をUnityで実装する話です。
検索してヒットするやり方とは異なる点がしばしば存在したので、忘却防止も兼ねて!

対象者

  • SteamWorks登録済み
  • 基礎的なプログラミング知識を有している方

使用環境

  • Windows10
  • Unity 2021.3.23f1

前提

  • ゲーム(クライアント)から、Stats(後述)を用いて実績を更新する処理にします。
  • Steamを起動しておき、SteamWorksで登録した管理者アカウントでログインしておきます。

大まかな流れ

  1. Stats登録(Web側)
  2. 実績登録(Web側)
  3. Steamworks.NETのセットアップ(Unity側)
  4. コード実装(Unity側)

Web側での設定

1. Statsの登録

まずSteam実績を設定する前にStats(データ)を設定します。
ゲームの様々なスコアをSteamのアカウントに紐づいて保存できる機能の様です。
収集物の取得数等、設定した値が最大値になると実績解除されるようにできます。

下記の通りに移動します。

  • SteamWorksのダッシュボード > 「アプリとパッケージ」タブ > すべてのアプリケーション
  • 上記ページより、実績を実装する対象のゲームについて、「Steamworks管理」を選択。
  • 「データ&実績」タブより、「データ」を選択。

1-1. Statsを新規登録

「新しい統計」を選択して、Statsを新規登録します。

タイプ API名 設定 増分のみ? 最大変化 最小数 最大数 デフォルト値 集計 ディスプレイ名
データ型を指定 後ほどAPIから呼び出す任意の名前を指定 データを修正できる対象の指定。「クライアント」を設定 減算しない値であればチェック ゲーム仕様上あり得る、1度で変化する可能性のある最大値を設定 ゲーム仕様上の最小値 ゲーム仕様上の最大値 ゲーム仕様上のデフォルト値 リーダーボードの集計値として使うならチェック Steamコミュニティでの表示名称

設定出来たら「SAVE」を選択。

2. 実績の登録

実際に表示される実績を登録します。
Stats登録ページより、「データ&実績」タブ > 「実績」を選択。

2-1. 実績を新規登録

「新しい実績」を選択して、実績を新規登録します。

API名 進行状況 ディスプレイ名 説明 設定 非表示? 達成アイコン 未達成アイコン
任意の名前を指定 先ほど設定したStatsを指定 実績として表示される名前 実績の説明文 「Client」を選択 チェックすると隠し実績になる カラーのjpg画像(256px × 256px推奨) モノクロのjpg画像(256px × 256px推奨)

設定出来たら「保存」を選択。

3.設定の反映

登録しただけだとAPIから呼び出しできないため、設定を公開します。
実績登録ページより、「公開」タブ へ移動します。

「公開の準備」 > 「Steamに公開」を選択。
ページに記載の確認コードを入力フォームに入力し、「本当に公開する」を選択。

これでWeb側の設定は完了です。

Unity側の設定

1. Steamworks.NETのセットアップ

下記からunitypackageをダウンロードして
「Assets」>「Import Package」>「Custom Package」で導入します。
https://github.com/rlabrecque/Steamworks.NET/releases

1-1. steam_appid.txtの設定

上記導入が完了すると、プロジェクトのルートディレクトリにsteam_appid.txtが生成されます。中身をゲームのアプリIDに書き換えます。
(アプリIDは「Steamworks管理」画面等で確認できる、ゲーム名横の数字)

1-2. SteamManager.csのアタッチ

ゲームの最初のシーンに、空のGameObjectを生成し(名前は任意)、Assets > Scripts にある「SteamManager.cs」をアタッチします。

2. コード実装

実績解除を行いたい処理のある任意のコードにて、下記のように実装します。

using Steamworks; // 必須

public class SampleController : MonoBehaviour
{
    private void Start()
    {
        if (SteamManager.Initialized)
        {
            // API初期化成功後(必須)
	    
            if (SteamUserStats.RequestCurrentStats())
            {
	        // ユーザーの現在のデータと実績を非同期に要求後(必須)
		
                // statsを更新
                SteamUserStats.SetStat("StatsのAPI名", 更新値);
                // 更新を反映
                bool bSuccess = SteamUserStats.StoreStats();
            }
        }
    }
}

あくまでサンプルなので、自身のゲームに合わせて改変してくださいね。

参考

https://tsukinowa.hatenablog.jp/entry/2018/08/03/172650
https://tsukinowa.hatenablog.jp/entry/2018/08/07/172931
https://partner.steamgames.com/doc/api/ISteamUserStats?l=japanese#SetStat

Discussion