ダウンロード方法
以下からダウンロード出来ます。
導入方法をちゃんと読まずに進めるとエラーが出るので、読んでからインストールくださいね。
バージョン・変更履歴
バージョン・変更履歴
2024/11/9
[V1.0.0] 初版リリース
PlayFabRankingToolsとは
前置きがどうでも良い人はこの部分を飛ばしてください。
まず、Unityなどのゲームでランキング機能や、マッチング機能などを実装する場合、ゲームデータをやり取りするためのサーバーが必要になります。
ただ、個人や少人数で開発する場合、サーバーを用意してバックエンドを作るには難易度が高く、時間も掛かります。
そこで、サーバー側のことをできるだけ意識せずに、比較的簡単にランキングやマッチング機能を実装出来る、PlayFabというMicrosoft社のサービスがあります。
ランキング機能を使う分には、10万ユーザまで無料という太っ腹なこともあり、個人開発や小規模開発の場合は、PlayFabを使われている方が多いとは思います。
2023年以前はニフクラという、初心者フレンドリーなランキング機能を提供しているniftyのサービスがあったのですが廃止されてしまいました。2024年現在、個人開発などの場合、ランキング機能はPlayFabを使った実装が中心になってきていると感じます。
ただ、個人的には、はじめてこのPlayFabという機能を使ってランキング機能を実装した時、こうも感じました。
「ランキングって、大して難しくなさそうな機能だと思っていたのに、やたら覚えること多い!ムズイ!」
たかがランキング、されどランキング。
ログイン処理、ランキングスコアの送信・受信処理、非同期処理、通信中のUIの表示など、実はランキング機能の実装のためには、作らないといけないもの、理解しないといけない要素が沢山あります。
パッケージを入れたらすぐにランキング機能が実装出来る、そんな楽ちんなライブラリがあったら、ラクだろうなと思い、だれでも簡単にランキング機能が実装出来る、「PlayFabRankingTools」をMITライセンスで配布することにしました。
デモ
このリンクからWebGLのサンプルを試せます。
PlayFabRankingToolsの特徴
出来ること
ビルドターゲット
・WebGL
・iOS
・Android
ログイン関連
・匿名ログイン(認証不要のログイン)
・ユーザ名の設定、変更
ランキング関連
・ランキングスコア(int型)送信
・自分のランキングデータ(順位、ユーザー名、スコア)の取得
・TOP〇〇位までのランキングデータの取得
・自分の順位の前後〇〇位までのランキングデータの取得
・複数のランキングを使い分ける
開発効率化
・ダミー用ユーザデータの作成とスコアの更新
全般
・サーバー通信中に、通信中である旨のUIの表示
出来ないこと
・上記に書いていないこと
・日本語(ひらがな、カタカナ、漢字など)でユーザ名を設定する(FAQを読めば設定出来ます)
・別サービス(GoogleやFaceBookアカウントなど)と連携した認証
・int型以外のスコアを扱う
導入方法
対応バージョン
Unity2021以降
前提ライブラリのインストール
以下のライブラリを前提としています。事前に以下のパッケージをインストールしてください。
具体的な方法も以下に記載しています。
① UniTask
② PlayFab SDK
③ PlayFab Editor Extensions
①UniTask
パッケージマネージャーから、「GIT URLからパッケージ追加」を行います。
https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask
入力したら、あとはEnterするだけです。暫く待つとインストールが完了します。
②PlayFab SDK & ③PlayFab Editor Extensions
次に、PlayFabをUnityで使えるようにするためのSDKとエディタ拡張機能を導入します。インストールするパッケージが2つあるので要注意。
手順としては
Unity 用 PlayFab SDK のインストール - PlayFab | Microsoft Learn
に記載されている、2つのパッケージダウンロード用のリンクをクリックしてパッケージをダウンロード。
ダウンロードできた2つのパッケージを、それぞれUnityのプロジェクトにドラッグアンドドロップで取り込みます。
取り込みが終わったら一旦準備完了です。
PlayFabの基本設定方法
次に、PlayFab側の基本設定をしていきます。
PlayFabのアカウント作成
https://developer.playfab.com/ja-jp/sign-up
から、アカウントを作成します。
こういう海外サイトはアカウント作成(Sign UP)ボタンの場所が分かりづらいので要注意。画面右上の方にあると思います。
また、2024年11月現在は、Microsoftのアカウントが必要になっています。
ゲームタイトルの設定
アカウントを作成し、ログインが出来たら、スタジオ名を設定する画面が出ます。後から変更出来るので適当に設定ください。
こんな感じの画面になっていれば、スタジオ(以下のスクショだと”Test”)とゲームタイトル(以下のスクショだと”My Game”)が設定されている状態なのでOKです。
ランキングの設定
次に、ランキングデータをやりとりが出来るようにするための設定をしていきます。
まずは作成したゲームタイトルを選択してください。
最初にダッシュボードが表示されると思います。これが、PlayFabの管理画面です。
現在のユーザ数などを確認することが出来ます。
さっそく、ランキングの設定をしていきます。
端末からの統計情報(ランキングデータなど)の送信を許可する
デフォルトのPlayFabの設定では、各端末からPlayFabにランキングデータを送信する機能が無効化されています。
まずはこれをONにします。
これを設定すると各プレイヤーがスコアを送信出来るようになります。
下部にある「Save」ボタンから、設定を保存します
ランキングの設定を行う
次にランキングの設定を行います。
どちらでもランキングデータを作成出来ます。
Legacyが付いていない方から作成すると、複数カラム(例えば、得点とアシスト数)を持ったランキングを作れます。
ただ、普通のランキングでよければ、Legacyの方で良いと思います。
ランキング名や、ランキングの更新頻度、ランキングの更新方法を設定します。
ここの設定項目は全部重要です。稼働してから修正するのが難しいのでしっかりとチェックします。
「Aggregation method」は、「Last」の場合、プレイする度にハイスコアが変わってしまいます。
以下の表を見て、適切なものに設定しましょう。
また、ここで設定したStatistic nameはUnity側で使うので控えておきます。
本パッケージのデフォルトのStatistic nameは、「HighScore」となっています。
また、PlayFabでは、ランキングのスコアの値は、int型(整数型)しかサポートされていません。
タイムアタックなどで小数点を使用したい場合は、大きめな整数の値をランキングデータにして、Unity側で小数点に変換するなどの工夫が必要です。
PlayFabRankingToolsの導入方法
PlayFabにUnityからログインする
画面上部の、「ウィンドウ」 > 「PlayFab」 > 「Editor Extensions」を選択します。
開いたら、分かりづらいところにいる左下のLOG INボタンを押します。
次に、Settingタブを選択し、StudioとTitleIDを選択します。リストから選択出来るのでラクチンです。
PlayFabRankingToolsのインストールする
前置きが大分長くなりましたが、ようやく本パッケージのインストールです。
といっても、こちらのサイトから「YRC_PlayFabRankingTools」というファイルをダウンロードし、Unity内にドラッグアンドドロップするだけです。
PlayFabRankingToolsの使い方
導入方法を2つ用意しました。
・【クイック実装】:とにかく時短で実装したい人 / 初心者向け
・【個別実装】:自分組み立てて実装したい人 / 中級者以上向け
【クイック実装】ランキングデータの送信とランキングの表示
とにかく簡単にランキング機能を実装したい人向け。
想定している使い方
ゲームをクリア時にスコアを送信し、リザルト画面で自分のランキング順位と、TOPランキングを表示する
実装方法
実装するには、以下の5ステップです。
①「YRC_PlayFabManager」を配置
以下のパスにあるPrefabをシーン内に配置してください。
Assets > Yu-Rin-ChiLibrary > PlayFabRankingTools > Prefabs
②PlayFabで設定したランキング名の設定
Prefabの子オブジェクトにいる、PlayFabRankingServiceのStatisticNameをPlayFabの管理画面で設定したランキングの名前にセットしてください。
③ビルド設定にランキング用シーンを追加
エディタ上部のウィンドウの「ファイル」 > 「ビルドプロファイル」を選択し、
ビルド対象のシーンに、「AdditiveRankingScene」を追加ください。
④スコア送信
スコアを送信したいタイミングで、以下のように記述したメソッドを実行してください。
await PlayFabManager.Instance.SubmitMyScore(playerScore, statisticName);
UniTaskを使った非同期処理のため、呼び出すメソッドにasync/await
を付ける必要があります。
UniTaskやTaskに慣れてなければ、以下のサンプルのコードをコピペください。
playerScoreには、int型(整数)の値を入れてください。statisticsNameには、PlayFabで設定したランキングの名前(string型)をセットします。
また、bool型で「スコアの送信に成功したかどうか」の戻り値を返します。そのため、以下のように実行結果に応じたエラーハンドリング可能です。以下サンプルです。
private async UniTask SubmitScoreAsync()
{
// 通信開始前の処理をココに書く
try
{
bool success = await PlayFabManager.Instance.SubmitMyScore(playerScore, statisticName);
// 通信後の処理をココに書く
if (success)
Debug.Log("スコア送信成功");
else
Debug.Log("スコア送信失敗");
}
catch (Exception ex)
{
// 例外処理をココに書く
Debug.LogError($"スコア送信中の例外エラー: {ex.Message}");
}
}
⑤ランキングの表示
ランキング用のビューを表示するには、以下のコードを1行記述するだけです。
PlayFabManager.Instance.LoadRankingScene(statisticsName);
statisticsNameには、PlayFabで設定したランキングの名前(string型)をセットします。
この処理を行うとランキング用のシーンが読み込まれます。ランキングデータを取得している最中は以下の画像のように通信中状態となり、
通信が終わるとこのように結果が表示されます。
デフォルトでは、ユーザ名が「nanashi」となっています。
InputFieldから名前を入力することで、ユーザー名を変更出来ます。
デフォルトの名前は「MyRankingData」というPrefabから設定が出来ます。
また、ユーザ名の登録には以下の制御が入っています。
また、ネットワークエラーなどで接続が出来なかった場合、以下のように接続に失敗した旨の画面が表示されます。
表示されるUIは自由にカスタムが可能ですので、以下のパスにあるシーンを編集してください。
PlayFabRankingTools > Scene > AdditiveRankingScene
注意事項1:日本語入力の対応
本アセットではTextMeshPro を使っていますが、Unity標準のフォントを使っているため、日本語入力に対応していません。
日本語入力を行いたい場合は以下のFAQを確認ください。
・日本語で入れた文字が全部 □□ で表示されるんだが
・WebGLビルド時に日本語が入力出来ない
【個別実装】PlayFab・ランキングに関する各種処理の呼び出し方法
自分でカスタムして実装したいのだが
自分の好きなタイミングで、ランキングやログインに関する処理を呼び出す実装をしたい人向けの解説です。
中級者向けとは書きましたが、ちゃんと読めば初心者でも実装出来るとは思います。
実装する場合、基本的にシングルトンインスタンスのPlayFabManager
を通じて非同期の処理を呼び出します。
通常の書き方と違う点は、メソッドの宣言時に async UniTask
を付けるのと、await
を付けてメソッドを呼び出す、という2点だけです。
※ボタンなどのイベントリスナーに紐づける場合は、async void
にしてください。
実際のコードを見るのが一番早いと思うので、呼び出し方のサンプルをPlayFabRankingTools > Scripts > Sample
にある、「SamplePlayFabToolsFunctions.cs」というスクリプトにまとめました。
分からなくなったら、一旦「SamplePlayFabToolsFunctions.cs」の書き方をコピーしちゃうのがよいです。PlayFabRankingTools > Scene > PlayFabRankingToolsFuncitions
を開くと、「SamplePlayFabToolsFunctions.cs」のメソッドの実際の動きを確認出来ます。
ログイン処理
以下のコードで呼び出すことが出来ます。
await PlayFabManager.Instance.StartLogin();
bool型で「ログインに成功したかどうか」の戻り値を返します。そのため、以下のようにログイン成功時に応じた分岐が可能です。
以下、サンプルのログインです。
private async UniTask StartLogInAsync()
{
// 通信開始前の処理をココに書く
try
{
bool success = await PlayFabManager.Instance.StartLogin();
// 通信完了後の処理をココから下に書く
if (success)
{
Debug.Log("ログインに成功");
}
else
{
Debug.Log("ログインに失敗");
}
}
catch (Exception ex)
{
// 例外処理をココに書く
Debug.LogError($"ログイン中の例外エラー: {ex.Message}");
}
}
ユーザ名の変更処理
以下のコードで呼び出すことが出来ます。
await PlayFabManager.Instance.UpdateUserName(userName);
userNameには、変更したいユーザの名前(string型)をセットします。
bool型の「ユーザー名の変更に成功したかどうか」の戻り値を返します。以下はサンプルのコードです。
private async UniTask UpdateUserNameAsync()
{
// 通信開始前の処理をココに書く
try
{
bool success = await PlayFabManager.Instance.UpdateUserName("namaedayo");
// 通信完了後の処理をココから下に書く
if (success)
{
Debug.Log("ユーザー名の変更に成功");
}
else
{
Debug.Log("ユーザー名の変更に失敗");
}
}
catch (Exception ex)
{
// 例外処理をココに書く
Debug.LogError($"ユーザ名変更中の例外エラー: {ex.Message}");
}
}
スコア送信処理
こちらを参照ください。
自分のランキングデータの取得処理
以下のコードで呼び出すことが出来ます。
await PlayFabManager.Instance.GetMyRankingData(statisticName);
statisticNameには、PlayFabで設定したランキングの名前(string型)をセットします。
bool型の「自分のランキングデータの取得に成功したかどうか」の戻り値を返します。
そのため、取得の結果に応じた分岐も可能です。以下はサンプルのコードです。
private async UniTask GetMyRankAsync()
{
// 通信開始前の処理をココに書く
try
{
bool success = await PlayFabManager.Instance.GetMyRankingData(statisticName);
// 通信完了後の処理をココから下に書く
if (success)
{
Debug.Log("自分のランキングデータの取得に成功");
}
else
{
Debug.Log("自分のランキングデータの取得に失敗");
}
}
catch (Exception ex)
{
// 例外処理をココに書く
Debug.LogError($"自分のランキングデータ取得中の例外エラー: {ex.Message}");
}
}
取得した自分のランキングデータは、PlayFabRankingService内のMyRankingEntriesに格納されているので、UIに表示するなどしてご自由にお使いください。
TOPランキングデータの取得処理
以下のコードを使用します。
await PlayFabManager.Instance.GetTopRankingData(statisticName);
statisticNameには、PlayFabで設定したランキングの名前(string型)をセットします。
bool型の「TOPランキングデータの取得に成功したかどうか」の戻り値を返します。
そのため、取得の結果に応じた分岐も可能です。以下はサンプルのコードです。
private async UniTask GetTopRankAsync()
{
// 通信開始前の処理をココに書く
try
{
bool success = await PlayFabManager.Instance.GetTopRankingData(statisticName);
// 通信後の処理をココから下に書く
if (success)
{
Debug.Log("TOPランキングデータの取得に成功");
}
else
{
Debug.Log("TOPランキングデータの取得に失敗");
}
}
catch (Exception ex)
{
// 例外処理をココに書く
Debug.LogError($"TOPランキングデータ取得中の例外エラー: {ex.Message}");
}
}
取得した自分のランキングデータは、PlayFabRankingService内のTopRankingEntriesに格納されているので、UIに表示するなどしてご自由にお使いください。
また、PlayFabRankingService内のFromTopDataVolumeの値を変更することで、上位何人までのデータを取得するかを設定出来ます。
自分の順位の周辺ランキングデータの取得処理
以下のコードを使用します。
await PlayFabManager.Instance.GetAroundMeRankingData(statisticName);
statisticNameには、PlayFabで設定したランキングの名前(string型)をセットします。
bool型の「自分の順位の周辺ランキングデータの取得に成功したかどうか」の戻り値を返します。
そのため、取得の結果に応じた分岐も可能です。以下はサンプルのコードです。
private async UniTask GetAroundMeRankAsync()
{
// 通信開始前の処理をココに書く
try
{
bool success = await PlayFabManager.Instance.GetAroundMeRankingData(statisticName);
// 通信後の処理をココから下に書く
if (success)
{
Debug.Log("自分周辺のランキングデータの取得に成功");
}
else
{
Debug.Log("自分周辺のランキングデータの取得に失敗");
}
}
catch (Exception ex)
{
// 例外処理をココに書く
Debug.LogError($"自分周辺のランキングデータ取得中の例外エラー: {ex.Message}");
}
}
取得した自分のランキングデータは、PlayFabRankingService内のAroundMeRankingEntriesに格納されているので、UIに表示するなどしてご自由にお使いください。
また、PlayFabRankingService内のAroundMeDataVolumeの値を変更することで、自分の周囲の何人までのデータを取得するかを設定出来ます。
便利機能
ログの表示レベルを変更
Prefabの、「YRC_PlayFabManager」のPlayFabManagerからログのレベルを変更出来ます。
- None:ログを表示しない
- Error:エラーログのみを表示
- Warning:ワーニング・エラーログのみを表示
- Info:すべてのログを表示
ダミーユーザーを作成する
「[Debug]CreateDummyUser」というオブジェクトのインスペクタウィンドウから、ダミーユーザの作成とスコアの送信が可能です。
Playモード中に、インスペクタウィンドウを見ると、ボタンが表示されます。
ボタンを押すことで、インスペクタに登録しているデータで、ダミーのユーザデータを登録することが出来ます。
- Create Dummy User and Submit Score :DummyIDで新規ユーザの作成
- Submit Score:DummyIDに紐づくユーザのスコアの更新
即座には反映されませんが、登録してから大体1-2分ほどが経てば、PlayFabの管理画面上で、以下のようにユーザが追加されたことを確認出来ます。
ライセンス
The MIT License (MIT)
Copyright (c) 2024 Yu-Rin-Chi
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
FAQ
「現在のコンテキストに 'PlayFabManager' という名前は存在しません」 というエラーが出る
以下のコードをスクリプトの冒頭に追加してください。
using YuRinChiLibrary.PlayFab;
ログインユーザIDはどこに保存されているの?
ユーザIDは、PlayerPrefsに保存されています。
デフォルトでは、ユーザIDは、UUIDという重複の可能性がほぼ(天文学レベルで)ありえないランダムな文字列のIDを発行し、各端末に保存する仕様です。
ゲーム開始時にPlayFabにログインするようにしたい
YRC_PlayFabManger内の「Play Fab Log In」クラスのLogInOnStartフラグをONにすると、Start処理で自動でログインが行われます。
日本語で入れた文字が全部 □□ で表示されるんだが
Unity標準のTextMeshProだと日本語に対応していないので、日本語を表示しようとすると、そんなフォントはない!ということで、□□で表示されます。
日本語を含めたフォントで表示したい場合は、こちらの記事に記載のとおり、日本語用のTextMeshProを作成して、各種UIのオブジェクトにフォントを割り当てください。
WebGLビルドすると日本語の入力が出来ない
Unity標準ではWebGLビルド時に日本語入力が出来ません💩
WebGLビルドで日本語入力に対応するには、以下の関連記事で方法を紹介しているので、ご確認ください。
ユーザ名にNGワードを入れたい
公序良俗に反するワードを入れてはいけない制御を入れる場合、こちらのアセットを入れるなどすると簡単に導入出来るみたいです。筆者は使ったことはありません。
ランキングが複数種類あるので使い分けたい
どのランキングにスコアを送るかを制御しているのが、「PlayFabRankingService」です。
複数のランキングにスコアを送りたい場合は、「PlayFabRankingService」をランキングの数分複製し、Statistic Nameを変更してください。
その後、PlayFabManagerの、PlayFabRankingServicesに複製したPlayFabRankingServiceを登録してください。
ダミーで作ったユーザを消去したい
PlayFabの管理画面からユーザの削除は可能です。
Playersを選択して、
Title Player accountの「Delete title player」を押します。
一度削除すると、そのユーザデータの復旧は出来ないので削除は慎重に...!
AdditiveRankingSceneのボタンが反応しないんだが!?
EventSystemがシーン内に1つも存在しないとボタンが反応しません。
ランキングの呼び出し元のシーンにEventSystemを追加してください。なにかしらのUIオブジェクトを配置すると自動的に追加されます。
問い合わせ
質問等あれば、Twitter(X)でDMかこのブログにコメントください。Discordでも大丈夫です、というかDiscordの方が助かります。
もし、内容が気に入っていただけたら、よければこちらのアセットもチェックしていただけると幸いです。
それでは、素敵ゲーム制作ライフを!
コメント