この記事でのバージョン
Unity 2018.4.8f1
はじめに
今回はUnityで作ったゲームに、Steamの実績を実装する方法の解説です!
ちなみにVRゲームでも全く同じ方法で実装可能です。
なお、Steamworksへの登録が済んでいる前提ですので、あしからず。
Steam(ブラウザ)上での設定
まずはSteam(ブラウザ)上での設定について解説していきます。
データ設定
Steamはゲーム内のデータを記録する事ができます。
そして「起動回数というデータを記録し、起動回数が10回になったら実績解除」
という具合に、データを使って実績を自動で解除する事も可能です。
もちろんデータを記録せずにいきなり実績を解除する事も可能です。
そのデータは「テクニカルツール」の「Steamworks 設定を編集」にある
「データ&実績」の「データ」から設定する事が出来ます。
例えば起動回数のデータを設定してみると以下のような感じ。
なお、各項目の意味は以下の通りです。
- タイプ : データの型の指定
- INT : 整数型
- FLOAT : 浮動小数点型
- AVGRATE : 移動平均型
- API名 : プログラムからデータを設定、ロードする時に使うキー
- 設定 : データの操作が出来る対象
- Client :ゲームアプリから直接操作
- GS :独自のサーバーからデータを操作
- Offical GS:Steamのサーバーからデータを操作
- 増分のみ? : 数が減らないデータの時はチェック
- 最大変化 : 一度に増えるデータの最大値
- 最小値 : データの最小値
- 最大値 : データの最大値
- デフォルト値 : データの初期値
- 集計 : リーダーボード(ランキング)で使う場合はチェック
- ディスプレイ名 : データの名前
実績設定
実績は「データ&実績」の「実績」から設定する事が出来ます。
例えば起動回数が10回越えた時の実績を設定してみると以下のような感じ。
なお、各項目の意味は以下の通りです。
- API名 : プログラムからデータを設定、ロードする時に使うキー
- 進行状況 : 実績解除の対象となるデータ
- ディスプレイ名 : 実績の名前
- 説明 : 実績の説明
- 設定 : 実績の操作が出来る対象
- Client :ゲームアプリから直接操作
- GS :独自のサーバーからデータを操作
- Offical GS:Steamのサーバーからデータを操作
- 非表示? : 獲得するまで隠しておきたい場合はチェック
- 達成アイコン : 実績達成後のアイコン(カラー推奨)
- 未達成アイコン : 実績達成前のアイコン(白黒推奨)
------------追記------------
ローカライズ時に使える便利スクリプトも作りました!
------------追記おわり------------
Steamworks.NETの導入
次はプロジェクトにSteamworks.NETを導入するのですが、これをそのまま入れるより
Steamworks.NET-Exampleというサンプル付きのものを導入した方が色々便利です。
上記のGitHubからプロジェクトを取得したら、Assets以下を自分のプロジェクトへコピーします。
この時、Steamworks.NET-Exampleなどのディレクトリにまとめて入れると後々分かりやすいです。
デフォルトでサンプルのゲームが設定されているので、
この状態でMainSceneを実行し、ボタンを押すと、
実績が解除され、お馴染みの実績解除演出(?)が右上に表示されます。
(VRではVR上にポップアップが表示される)
なお、Steamを起動してないとエラーが出ます。
[Steamworks.NET] SteamAPI_Init() failed. Refer to Valve's documentation or the comment above this line for more information.
自分のゲームを設定する時は
Assetsと同じ階層(Unityからは見えない所)にあるsteam_appid.txtにAppIDを設定し、
Unityを再起動します。(再起動しないと変更が反映されない)
ここでいうAppIDとはSteamのゲームごとに設定されているIDの事です。
実装
最後にデータや実績の操作をプログラムで実装する方法について、
重要な部分だけざっくりと解説していきます。
なお、実装にはusing Steamworks;が必要です。
初期化
まずはSteamManager.Initializedで初期化を行う必要があります。
なお、返り値が初期化が成功したかのbool値となっています。
//初期化 if (SteamManager.Initialized){ //初期化が成功したらAppIDを表示(480はサンプルのID) Debug.Log($"Steamの初期化成功, AppID : {SteamUtils.GetAppID()}"); } else { Debug.Log("Steamの初期化失敗"); }
ちなみに、ユーザ名はSteamFriends.GetPersonaNameで取得可能です。
データ設定
データの設定にはSteamUserStats.SetStatとStoreStatsを使います。
//データの設定(apiがAPI名でstring、valueが設定するデータでintかfloat) SteamUserStats.SetStat(api, value); SteamUserStats.StoreStats();
StoreStatsを実行しないと送信がされない点には注意が必要です。
データ取得
データの取得にはSteamUserStats.GetStatを使います。
//データの取得(apiがAPI名でstring、valueが取得するデータでintかfloat) SteamUserStats.GetStat(api, out value);
返り値で取得するのではなく、outの引数で取得する点には注意が必要です。
実績解除
実績を直接解除したい時はSteamUserStats.SetAchievementを使います。
//実績の解除(apiがAPI名でstring)
SteamUserStats.SetAchievement(api);
なお、進行状況で対象となるデータを設定してる場合は自動で実績が解除されるので、
この処理は必要ありません。
データと実績のリセット
データと実績のリセットにはSteamUserStats.ResetAllStatsとRequestCurrentStatsを使います。
//データと実績を全てリセットする SteamUserStats.ResetAllStats(true); SteamUserStats.RequestCurrentStats();
参考