前回も書いたけど、ニフクラでのランキングはどうにも、しっくりこなかったので、Playfabでのランキング実装をやってみることにした。
まずはPlayfabのアカウント登録だが、僕の環境では普通に検索すると、AzurePlayFabが先頭に来てしまうが、とりあえずこれは別物。
PlayFabのアカウント登録は、ここになります。https://developer.playfab.com/en-us/sign-up
利用料金は非常に難解で、僕には理解しきれませんでしたが、オンラインサロンの皆に聞いた限りでは、料金請求された事がないそうなので、そこまで気にする事はないのかも。
むしろ、料金発生するくらい遊んでもらえれば、それはそれで本望😆
とはいえ、ご利用は自己責任です🤣
他のアプリを作成する時のための備忘録として、実装方法を記載しておきます。
PlayFabアカウントを作成したら、https://learn.microsoft.com/ja-jp/gaming/playfab/sdks/unity3d/quickstart
を参考にUnityにPlayfabを適用してログインし、SDKを適用する。
さらに、PlayfabのAPI設定で「クライアントがプレーヤー統計を投稿できるようにする」にチェックを入れる。
この辺りは、しまづさんの動画で詳しく説明があるので、下記の14:50くらいを見てください。
これで漸く、アプリにPlayfabへのアクセスを作成していく様になる。
まずは、Playfabにプレイヤーとしてログインするためのアカウントを作成する。
アカウントというとちょっと面倒に思うところだけど、実際のところ、この辺りはUnityとPlayfabが勝手に処理してくれるので、そこまで畏まる必要はない😀
必要なのはカスタマID。文字で固定で指定もできるが、いろんな人に遊んでもらうために、ここはGUIDをSystemから生成して使うことにした。
それを踏まえて、ログインはこんな感じにした。
using System.Collections; using System.Collections.Generic; using System.ComponentModel; using UnityEngine; using UniRx; using PlayFab; //Playfabを使う時のお約束 using PlayFab.ClientModels; //Playfabを使う時のお約束 using System; public class GameManager : MonoBehaviour { public int[] scrnking=new int[5]; public string[] scrnkingName=new string[5]; public int[] scrnkingScore=new int[5]; private void Start() { public ReactiveProperty<int> Score = new ReactiveProperty<int>(0) ; var guid=System.Guid.NewGuid(); //GUIDの取得 PlayFabClientAPI.LoginWithCustomID( new LoginWithCustomIDRequest { CustomId = guid.ToString(), CreateAccount = true}, //端末固有IDを使ってアカウントを生成してログイン。 result => Debug.Log("ログイン成功!"), error => Debug.Log("ログイン失敗")); Invoke("GetRanking",10); //ログインには数秒かかるので、ランキング取得は10秒後に行なっている。 } public void GetRanking() { PlayFabClientAPI.GetLeaderboard( new GetLeaderboardRequest { StatisticName = "HighScore", //あらかじめ、Playfabにこの名前のリーダーボードを作成しておく。 StartPosition = 0, //取得順の最上位から MaxResultsCount = 5 //何番目までを取得。ここでは5位まで。ランキングはあらかじめ5位まで作成しておく。 }, result => { for (int i = 0; i < 5; i++) //取得したランキングを変数に格納。 { scrnking[i]=(int)result.Leaderboard[i].Position+1; scrnkingName[i]=result.Leaderboard[i].DisplayName; scrnkingScore[i]=(int)result.Leaderboard[i].StatValue; } }, error => { Debug.Log("エラー"); Debug.Log(error.GenerateErrorReport()); } ); } }
タイムオーバーになって、ゲームが終わってスコアが確定したら、格納しておいたランキングのスコアと順位を判定してやれば良い。
今日の時点は、取得しておいたランキングの表示に留めた。
明日はスコア判定とスコアアップを実装しよう。