【Unity】Steamで実績/Achievementsを実装する【Steamworks】
Steamで実績を実装してみたので忘備録として書いておきます。
(書いてる筆者はド素人ですので色々間違っている可能性あります)
大前提としてSteamworks.NETをUnityにインストールしておいて下さい。
インストール方法は
【Unity】Steamでオンラインランキング/リーダーボードを実装する【Steamworks】
で書いています。
当初は実績なんて無くても良いかなーと思っていたのですがゲームリリース後に実績目的で遊ぶ人もいるので実装した方が良いよとアドバス受け実装してみました。
ランキングと比べると実績の実装は簡単なのでやってみても良いと思います。
実装にあたり
Steam実績を実装する(Steamworks側設定編)
Steamの実績をUnityで実装する【Unity】【Steam】
コチラのサイトさんを参考にさせて頂きました。
まずはSteamworks管理画面のデータ&実績から実績を開きます。
実績にはクリアで達成などのオンオフのみで実装できる実績と、100万点とったら実績といった数値データが必要な実績があると思います。
これの数値データが必要な実績で何%まで達成みたいな表示を行いたい時は「データ&実績」のデータ画面でデータを先に作る必要がありますが今回は使わないので書きません。
(上記参考サイトさんで解説されています)
逆にオンオフのみで達成出来る実績の場合はデータを作る必要はなく実績の方だけ作れば良いです。
まずは実績アイコンを作ります。
実績アイコンは256x256のjpg画像が推奨されていますが実際に表示される時は凄く小さく表示されるので最少サイズの64x64くらいで表示されると思って作った方が良いです。
取得していない時のアイコンは取得している時のアイコンをモノクロにした物にします。
こんな風に作りましたが、実際の画面では全然文字が読めませんでした(笑)
実績画面で実績の項目を作っていきます。
新しい実績ボタンをクリックすると実績作成の項目が出てきます。
それぞれの意味は
API名:Unityでプログラムなどから指定する時の名前
進行状況:オンオフのみの実績なら「なし」最小値/最大値も0で良い。何%まで達成の表示を行うときはデータ画面で作成したAPI名を選択して最小値/最大値を入力する
ディスプレイ名:実績の名前。Steamクライアントなどで表示される実績名です。
説明:ディスプレイ名の下に表示させる実績の説明(「ステージ1をクリアした」みたいな感じ)
設定:データを修正できる人を設定
Client / ゲームアプリから更新(基本はコレを選択する)
GS / 自分でサーバーを立ててソコから更新する
Offical GS / Steamゲームサーバーから更新する
非表示?:獲得するまで表示しない(隠し実績)
達成アイコン:実績解除後のアイコン(カラー推奨)
未達成アイコン: 実績解除前のアイコン(白黒推奨)
以上をそれぞれ埋めていきます。アイコンは設定してもすぐに反映されません。途中で一度保存してから再度読み込むと上手くアップロード出来るようです。
@Unityへの実装
まずはスクリプトの最初にusing Steamworks;を記述します。Steamクライアントも起動させておかないとエラーになります。
実績解除の流れとしては
1.SteamManager.Initializedで初期化
2.SteamUserStats.RequestCurrentStats();でtrueが返ってくるか判別
3.SteamUserStats.SetAchievement("作成したAPI名");で実績解除
4.SteamUserStats.StoreStats();で解除を反映する(ポコンする)
と言った感じ
実際の実績解除はこんな風に書いています。
if (SteamManager.Initialized)//初期化
{
if(jisseki_kaijyo == 1)//実績解除フラグ
{
bool User_data = SteamUserStats.RequestCurrentStats();//サーバーから、ユーザーの現在のデータと実績を非同期に要求します。
if (User_data == true)
{
SteamUserStats.SetAchievement("_Standard_mode_clear");//実績解除
SteamUserStats.StoreStats();//ポコンする
}
}
}
else
{
Debug.Log("Steamの初期化失敗");
}
あと、すべての実績を解除した時の実績を作りたいなと思ったので
SteamUserStats.GetAchievement("作成したAPI名", out bool);で解除した実績を調べられる(trueだと実績を解除している)ので全ての実績を調べて解除するようにしました。
bool ret = SteamUserStats.GetAchievement("_Standard_mode_clear", out onoff01);
ret = SteamUserStats.GetAchievement("_Classic_mode_clear", out onoff02);
ret = SteamUserStats.GetAchievement("_Challenge_mode_clear", out onoff03);
ret = SteamUserStats.GetAchievement("_Standard_mode_NC_clear_A", out onoff04);
ret = SteamUserStats.GetAchievement("_Standard_mode_NC_clear_B", out onoff05);
ret = SteamUserStats.GetAchievement("_Classic_mode_NC_clear_A", out onoff06);
ret = SteamUserStats.GetAchievement("_Classic_mode_NC_clear_B", out onoff07);
if (onoff01 == true && onoff02 == true && onoff03 == true && onoff04 == true && onoff05 == true && onoff06 == true && onoff07 == true)
{
bool User_data = SteamUserStats.RequestCurrentStats();//サーバーから、ユーザーの現在のデータと実績を非同期に要求します。
if (User_data == true)
{
SteamUserStats.SetAchievement("_All_achievements_unlocked");
SteamUserStats.StoreStats();
}
}
@実績のローカリゼーション
作った実績を色々な言語にローカリゼーションしたい時はSteamworks管理画面のデータ&実績から実績のローカリゼーションを選択します。
作成したい言語にレ点を入れて保存。
ALL Languagesを選択してローカリゼーションデータをダウンロードします。
ダウンロードしたデータをテキストエディタ等で開きます。
設定したい言語の所が空白になっているので埋めて上書き保存します。
保存したファイルを選択してアップロードすればOK
実績画面に戻ると言語が選択出来るようになっています。
これで上手く出来るはずなんですが自分の場合は日本語だったからか上手く反映出来なくて、結局実績を作成する画面のEditで一つづつ更新しないと駄目でした。