前書き
Steamの実績を実装する方法はいろいろなサイトに載っているのですが、今後も同様の作業をすると思うので自分なりにかみ砕いてSteamの実績を導入する方法を残しておこうと思います。
今回はSteamworks.NETの導入から先の手順についてになります。Steamworks.NETの導入が終わってなくても実績の設定はできますが、いずれにせよ必要になるのでSteamworks.NETの導入が終わってない方は第1回の記事も参考にご確認ください。
また、Steamの実績導入のために参考にしたのは以下のサイトになります。
大まかに作業する工程
UnityでSteamの実績を実装する工程としては簡単に以下3つになります。
- Steamworks.NETをUnityに導入する(個人的にここが一番の詰まりました)
- Steamworksで実績の設定を行う
- 2.で設定した実績を読み込む実装をする
今回は「2.Steamworksで実績の設定を行う」について説明をしようと思います。こちらについてはSteamworskのWebサイトから実績を設定することになるため比較的簡単な作業になると思いますのでサクサク説明していきたいと思います。
Steamworksで実績の設定を行う
Steamworksでの実績の設定場所は
コミュニティプレゼンス -> 実績 から設定することができます。
実績を設定するときに「データ」と「実績」の2つの項目がありますが設定したい実績によって設定の有無が変わってきますのでそれぞれ説明していきたいと思います。
データについて
データの使われ方としては「設定された項目」が「どのくらいの進捗まで進んだか」を判断するために使われます。
例えば「敵を100体中何体倒した」とか「ゲームの進捗が50%まで進んだ」などON/OFFではなく、「目標値に対してどのくらいまで値が設定されたのか?」を判断して実績を設定したい場合にデータを設定します。
各項目について簡単に説明していきます。
ID
Steamworksが自動で設定する値です。実装上でも特に使う値ではないので無視してもらって大丈夫です。
タイプ
取得する値の型を決めます。INT、FLOAT、AVGRATEの3種類があります。
自分がよく使うのはINT型(小数点なしの整数値を取り扱う)で、主に敵の倒した数や取得したポイントの数など小数にならないようなときに使用しています。
いまのところINTしか使ったことがないのでAVGRATEがどういった機能を持つかわからないのですが、「移動平均」の値を扱いたい場合はAVGRATEを使うみたいです。
API 名
実装時に呼び出す名前になります。ここで設定したAPI名をソースコード上に記載する必要があります。
設定
クライアント、GS(GS=ゲームサーバ)、Offical GSの3種類があります。
Steamworksドキュメントを見ると「ゲームサーバーと公式ゲームサーバーの違いは、公式ゲームサーバーはあなたがホストし管理するサーバーであるという点です。」と、言うことでサーバを立てることでサーバによってデータの管理ができるようです。基本的には「クライアント」にしておいて、ゲームを起動したプレイヤーのプレイ状況を見て実績を発生させる方式でいいかなと思います。
増分のみ?
設定される値が増加する場合のみに限定するかどうかを設定します。例えば、ゲームのクリア回数やいままでの敵を倒した数など減ることのない項目の場合が該当すると思います。
最大変化/最小値/最大値
設定される項目の値が取り得る「最大変化/最小値/最大値」を設定します。例えばゲームクリア回数の実績を作りたい場合に最大100回クリアまでの実績とすると、
- 最大変化:1(ゲームクリアは1回ずつでしか増えないため)
- 最小値:0
- 最大値:100
になるかなと思います。
ウィンドウ
項目としてあるのですが、設定できないため無視します。
# ドキュメントにも乗っていない項目です…なんでだろう?
デフォルト値
最初に設定される値です。上記例のゲームクリア回数で言うとデフォルト値は”0″になるかと思います。ものによってはデフォルト値が”0″じゃないこともあり得るので、項目によって適宜値を設定してください。
集計
ここにチェックを入れることで、プレイヤー全員の総数を保管するようSteamに指示することができます。例えば、「ボスを倒したプレイヤーの数」といったプレイヤー全員に関わるものを設定したい場合は設定することになるかと思います。
ディスプレイ名
ゲーム上に表示するための名前になります。
データの設定項目については以上になります。続いて実績の設定について説明していきます。
実績について
ここでゲーム上に表示するアイコンなどを設定します。先ほど作成したデータを使って実績に反映するのもこの画面上で行います。データと同様にそれぞれの設定項目について説明していきます。
API名/進行状況
- 進行状況上の空欄は進行状況を使わないときに呼び出すAPI名になります。
→こちらは「データを用いないで実績を表示したい場合のAPI名」を設定します。 - 進行状況すぐ下の空欄は”データ”で設定したAPI名を設定します。合わせて、進捗の最小値~最大値を設定し、最大値に達した場合に実績が表示されます。
→こちらは「データを用いた時の実績を表示したい場合のAPI名」を選択します。
ちょっと文章で表現するのは分かりずらいですが、実績を表示する方法は2パターン存在して、
- 特定のAPI名を指定して実績を解除する
- 特定のAPI名の進行状況を満たしたら実績を解除する
の2つがあります。1.の場合はAPI名を指定して実績解除の指示を出した瞬間に実績が解除されるため進行状況などはありません。2.の場合は値を積み重ねていって一定の進行状況を超えたら実績が解除されるため進行状況などがあります。
ひとつ注意としてはAPI名は必ずユニークな名前にする必要があるため、API名と進行状況のAPI名が重複した場合、エラーになります。例えば、以下の例で言うと進行状況の中にある10000CoinsというAPI名を現在「1000 Points Defeating Enemies」の欄に書いた状態で保存し、Steamの公開を行うと、
以下のようにSteamの公開に失敗し、エラー終了します。エラー内容を見てみると分かるのですが“データ”で設定したAPI名と”実績”で設定したAPI名が重複しているためエラーになっていることが分かります。そのため、API名は”データ”と”実績”それぞれでユニークな名前を設定する必要があります。
逆に言うと、“データ”と”実績”それぞれでユニークな名前を設定すればフラグが有効になった場合に実績を解除しつつ、進行状況によって実績を解除する2通りの方法での実績の解除を設定することもできます。
例えば、上記の設定であればエラーになりません。「Flag On」のAPI名で実績を解除する条件を作りつつ、「10000Coins」の進行状況によって実績を解除する条件を作り出すことができます。
ディスプレイ名/説明
以下が実績を解除した時に出てくるポップアップになります。
ディスプレイ名は「1000ポイント」の部分が該当し、説明は「おめでとうございます!あなたは「1000ポイント」を達成しました!」の部分が該当します。
他のゲームの実績を見てみると
- ディスプレイ名:説明に紐づく実績の名前
- 説明:どういった理由で実績を解除したのか
こういった形で実績を表記していることが多いかなと思います。他のゲームの実績を参考に作ってみるのがいいかなと思います。
設定
実績を解除する人を指定します。初期値がクライアント(=プレイヤー)になっていますが、サーバを立てている場合はGS(GS=ゲームサーバ)やOffical GSになるかと思います。
非表示?
実績が解除されるまで実績欄に表示しないこともできます。実績が事前に表示されるとネタバレになったりする場合はここにチェックを入れておくのがいいかと思います。
達成アイコン/未達成アイコン
ゲーム上やSteam上で表示するためのアイコンを設定します。Steamworksとしては「獲得済みのアイコンには色を使用し、獲得済みでないアイコンには白黒を推奨しています」となっているので、未獲得のアイコンについては白黒にするのがいいかと思います。
Steamworksで実績を設定する方法は以上になります。実績など修正すると以下のように「これらの変更を提出するには「公開」タブの公開ツールを使ってください。」と表示されます。Steamに公開(= Steamの更新)を行わないと設定した実績が反映されず、ゲームから読み取ることもできないため変更があったら忘れずSteamに公開をしてください。
いろいろとかみ砕いて説明していきましたが詳細について知りたい場合はSteamworksドキュメントに記載があるため気になる方は確認をしてみてください。
まとめ
今回はSteamworksで実績を設定する方法について紹介しました。
SteamworksのWebサイト上でポチポチやりながら設定できるため比較的簡単な作業だと思います。また設定したAPI名やアイコンなども手軽に直すことができるので、とりあえず枠組みだけ用意しておいて後で修正することも簡単です。
「データ」と「実績」の2つがあり、どっちで実績を作ろうかな?っと悩むと思うのですが、実装的にもフラグのON/OFFで出来る「実績」が簡単に感じています。なので最初は「実績」で作っておいて慣れてきたら「データ」で作るといいかなと思います。
次回はSteamworksで設定した実績をどのように実装するのかを説明していこうと思います。
コメント