ランキングを作成する
ログインすると特定のランキングボードにスコアを送信できるようになりました。
ただ、まだランキングボードを作っていないのでウェブサイト上で作成する必要があります。
サイトで作成しタイトルを選択するとこの画面になります。

ランキングを作る手順としては
となります。
ここのランキング名を指定してスコアを送信することで
ランキングボードに自身のスコアが登録されます。

私の場合は月間ランキングを作るために「HighScoreMonth」というのも作っています。中身はリセット頻度が「毎月」に設定されているだけとなります。
ランキングの表示順番
PlayFabではランキングがどういう順でソートされるかをここで設定する必要がありますので
スコアが高い値が順位が高い場合は「最大(常に最大の値を使用)」を設定してください。
逆の場合は「最小」を選択します。
ランキングにスコアを送信する
準備は整ったのでスコアを送信していきます。
ソースコードはこちら
using PlayFab;
using PlayFab.ClientModels;
using UnityEngine;
void SendScore(int score)
{
PlayFabClientAPI.UpdatePlayerStatistics(
new UpdatePlayerStatisticsRequest
{
Statistics = new List(settings.LinkedClassNames.Count+1)
{
new StatisticUpdate{ StatisticName = "HighScore", Value = score,},
new StatisticUpdate{ StatisticName = "HighScoreMonth", Value = score,}, // 同時に送る場合のみ
}
},
result => Debug.Log("スコア登録に成功!"),
error => Debug.Log("エラー!")
);
}
スコアを送信するAPIを実行します。
注意したいのはスコアはint型しか見当たりませんでした。
そのため時間などを保存したい場合はint型で保存、読み込みを表示時に変換処理をかませる必要がありそうです。

NCMBに比べると汎用性が低いのですが、逆にフォーマットが決まっている分、ライトユーザーが複雑に触らなくて良いのはいい感じだと思っています
注意点もある
一般的なゲームの場合、スコアを送信して自分が含まれたランキングを確認するという流れになると思うのですが、実はスコアを送信してすぐにランキングを取得すると値が古いケースがありました。
そのため私の場合はスコアを送信してから数秒待ってから読み込むようにしました。
なにか良い設定がありそうですが、サーバー側は大量のリクエストをさばくのでリクエストごとに処理を待たせているとサーバーが大混雑する可能性もあるので一旦これで良いかなと思っています。

もし起きたとしてももう一度の読み込むと正常な値になっているので
仕方ないかな…
ランキング一覧を取得してくる
ランキングが登録されても見た目に出せないと意味がないので
ここからは登録されているランキングを表示する方法を紹介します。
上位ランキングを取得する場合
上位100位などを取得する方法はこちら
public void LoadRanking(string rankingName, int displayCount)
{
PlayFabClientAPI.GetLeaderboard(
new GetLeaderboardRequest
{
StatisticName = rankingName,
MaxResultsCount = displayCount,
},
result =>
{
foreach (var item in result.Leaderboard){
var rank = item.Position + 1; // 0始まりなので+1
Debug.Log($"{rank} {item.DisplayName} : {item.StatValue}"); // 例: 1 テッドラボ : 12324378
}
Debug.Log("成功!")
},
error => Debug.Log("エラー!")
);
}
引数の説明として
となります。

ここではDebug.Logで表示しています
自分付近のランキングを取得する方法
例えば上位100位圏外だった場合に自分の近くのユーザーを知りたいですよね。
そういったときは「GetLeaderboardAroundPlayer」を使うことで可能です。
public void LoadRankingAround(string rankingName, int displayCount)
{
PlayFabClientAPI.GetLeaderboardAroundPlayer(
new GetLeaderboardAroundPlayerRequest()
{
StatisticName = rankingName,
MaxResultsCount = displayCount + 1, // 自身も含むため+1
},
result =>
{
foreach (var item in result.Leaderboard)
{
var rank = item.Position + 1; // 0始まりなので+1
Debug.Log($"{rank} {item.DisplayName} : {item.StatValue}"); // 例: 1 テッドラボ : 12324378
}
Debug.Log("成功!")
},
error => Debug.Log("エラー!")
);
}
注意したいのは「displayCount」は+1して「MaxResultsCount 」に設定しています。
これは自分を含む数を指定するためです。

基本的に関数名とリクエストの型を変えるだけで実装できます
自身の順位だけを知りたい時
ランキングを表示するというよりも自分の順位だけ知りたい場合があると思います。
そういうときは先程の「PlayFabClientAPI.GetLeaderboardAroundPlayer」を利用して
「MaxResultsCount」を1として実行すると「Position」が取得できるのです。

色々探したのですが、海外の方が
「この方法しかない」的な投稿しか見当たりませんでした
これでランキングを実装できる
これまで紹介したスクリプト
でランキングは実装するための要素は揃ったと思います。

これでランキングの乗り換えが出来るはず!
PlayFab実装が完成できたら
PlayFabで実装して問題なければAssets直下にあるNCMBフォルダは削除してしまいましょう。
色々混ざっていると何を使っているかわからなくなる可能性もあるのと
モバイル向けビルドはよくエラーの原因になりますので。

ちなみにNCMBはバージョンによっては「Scenes」みたいなフォルダにもアセットが作成されるので忘れず削除しておくのが良さそうです
活動内容のPR
下記が本サイトでの活動内容となります。
終わりに
いかがでしたでしょうか。
これで一応は私が使っていたNCMBの機能は網羅できたように思います。
PlayFabを使っているととてもシンプルでNCMBを使うよりも
かなり簡略されているという良い印象を受けました。

分かる人にしかわからないかもですが、アカウント単位にデータが蓄積されているのでランキングごとに関連づけしなくても良いのがとても良き
では本記事はここで終わりとなります。
もし何か不足などありましたらコメントいただけますと幸いです。
ではここまでお読みいただきありがとうございました。
任意のユーザー名をランキングに追加するエディタ作りました 2023/12/23
PlayFabのウェブサイトにはランキングに架空のユーザーを手動で登録する方法が見当たらなかったので自身で追加できるようにUnityのエディタを作りました。

ぜひご活用ください!




コメント