💽

[Unity] Steam実績をStatsを使用しないでシンプルに実装する (2024.04)

2024/04/24に公開

はじめに

私が初めて Steam のゲームに実績を実装する際に、なるべく簡単に実績を実装したくStats を使用しない実装を行いました。多くの記事では STats を使う前提としており、実装当初は Stats は必須のものと勘違いして、余計な時間をかけてしまいました。
そういった背景から、今回 Statsを使用しない実装方法について、途中躓いたところなども合わせて記事にさせていただきました。
これからSteamにゲームを出すために実績の実装をしようとしている方のお役に立てれば幸いです。

対象者

  • SteamWorks 登録済みであり、ストア公開済みの方
  • Steamworks.NET を導入済みの方
  • Steam実績 を実装する方(主に初めて実装する方)

環境

  • Windows10
  • Unity 2022.3.12f1

事前準備

  • ストア公開で保留しているものがあれば、公開して問題ない状態にします(手順内でストア内容の公開が必要なため)

対応手順

1. [SteamWorks] 実績登録

1.1 実績を設定するアプリを選択

SteamWorksのダッシュボード > [ アプリとパッケージ ] タブ > すべてのアプリケーション を開きます
タブ表示
実績を設定したいアプリを選択します
すべてのアプリケーション

1.2 コミュニティプレゼンスから実績を選択します

コミュニティプレゼンス内の実績

1.3 [ 新しい実績 ] をクリックします

新しい実績

1.4 実績を登録します(アイコン除く)

以下を入力して、[ 保存 ] を行います。

  • API名
    • 任意の名前を指定(後でスクリプト側から呼び出す際に使用します)
  • 進行状況
    • なし、最小値: 0、最大値: 0
  • ディスプレイ名
    • 実績のタイトルを指定します
  • 説明
    • 実績の詳細を指定します
  • 設定
    • Clientを指定します
  • 非表示
    • 隠し実績にする場合、チェックを入れます
    • 隠し実績は、グローバルプレイデータには説明以外確認できてしまうので注意
  • 達成アイコン
    • 未選択
  • 未選択アイコン
    • 未選択
      実績登録画面001
      実績設定例
アップロード時に発生するエラー

「 There was an error uploading that image. The application data is missing; please save the achievement before adding its images.」というエラーが出てアップロードが失敗します。
保存する前にアイコンをアップロードしようとする

1.5 実績を登録します(アイコンのみ)

[ ファイルを選択 ] を押し、設定したいアイコンを選択します。
その後、[ アップロード ] を押します。
アップロードが成功すると、画像のようにアイコンが表示されるので、意図した画像になっていることを確認して、[ 保存 ] を押します。
実績登録画面002

1.6 実績を公開します

ストアの変更を公開しないと、スクリプトから実績を参照することができません。
[ 公開 ] タブをクリックし、[ 公開の準備 ] > [ Steamに公開 ] を行います。

ストア公開

アプリリリース前の実績表示例

ストア内の実績表示
ストア内の実績表示
グローバルプレイデータ画面
グローバルプレイデータ画面

2. [スクリプト] 実績の達成

以下を実績達成させたい箇所に記載します。

if(SteamManager.Initialized)
{
    SteamUserStats.RequestCurrentStats();
    SteamUserStats.SetAchievement("API名");
    SteamUserStats.StoreStats();
}

3. [Unity] ゲームをプレイし実績が達成されるか確認

右下に実績が出れば、完了です。
実績達成表示

なお、Steamクライアント上でも達成した実績が確認可能です。

Tips

実績の達成状態を確認

実績が想定通り達成したかを確認するのに使用します。

if(SteamManager.Initialized)
{
    SteamUserStats.RequestCurrentStats();
    bool isCleared; // 達成なら true, 未達成なら false が入ります
    SteamUserStats.GetAchievement(name.ToString(), out isCleared);
}

実績を未達成に

主にテストなどで一度達成した実績を解除するのに使用します。
あまり影響はないと思いますが、Steam上のアクティビティには残っていますので、その点はご注意ください。

if(SteamManager.Initialized)
{
    SteamUserStats.RequestCurrentStats();
    SteamUserStats.ClearAchievement("API名");
    SteamUserStats.StoreStats();
}

参考

https://zenn.dev/isayoshi/articles/0b6e84e59f379c
https://partner.steamgames.com/doc/features/achievements

Discussion