Unity製ゲームでSteam実績を実装する話2023
はじめに
Steamのゲームでよくある実績機能をUnityで実装する話です。
検索してヒットするやり方とは異なる点がしばしば存在したので、忘却防止も兼ねて!
対象者
- SteamWorks登録済み
- 基礎的なプログラミング知識を有している方
使用環境
- Windows10
- Unity 2021.3.23f1
前提
- ゲーム(クライアント)から、Stats(後述)を用いて実績を更新する処理にします。
- Steamを起動しておき、SteamWorksで登録した管理者アカウントでログインしておきます。
大まかな流れ
- Stats登録(Web側)
- 実績登録(Web側)
- Steamworks.NETのセットアップ(Unity側)
- コード実装(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」で導入します。
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();
}
}
}
}
あくまでサンプルなので、自身のゲームに合わせて改変してくださいね。
参考
Discussion