この記事でのバージョン
Unity 4.6.3f1
Lobi 5.4.6
RankingManager
次に、Lobiランキング用の自作マネージャクラスをご紹介!
とりあえずこれがあれば、ランキング周りの大体の事は出来るはずです。
また、SingletonMonoBehaviourというクラスを継承しているので、
そんなの知らない!って方はこちらもご確認ください。
さらに以前紹介したTypeDataというクラスも使っているので、
こちらも要確認!
さらにさらにJsonを扱うためJsonObjectというクラスも使っております。
それはこちらで。
コールバックでエラーハンドリングしてなかったり、
拙い部分が多々あるので、使う人は自己責任でお願いします。
RankingManager設定
まず、上の方にあるenum RankingTypeにランキングIDを設定します。
上記の例では、Score1とScore2という二つのランキングがある事になります。
ランキングIDはLobi Developers上で作成したランキングページを開き、
ランキング設定編集ボタンを押し、
開いた設定ページ内で確認出来ます。
次にRankingTypeの下にあるRANKING_INITIAL_VALUEに
スコアの初期値を設定します。
上記の例では、Score1とScore2共に初期スコアは0になっています。
さらに、このRankingManagerをてきとうなGameObjectにつけると、
他のスクリプトから参照出来るようになります。
また、DontDestroyOnLoadしているので、シーンを跨いで利用できます。
なお、下記のコードはユーザー名の保存と読み込み処理ですので、適宜置き換えてください
SettingDataManager.Instance.SaveUserName (userName); SettingDataManager.Instance.LoadUserName ()
ユーザ名を最初に入力してもらい、
それを使ってサインアップやらをやっている感じです。
RankingManagerの使い方
他のスクリプトからRankingManagerを使う例は以下の通りです。
//たかしというユーザ名で登録(既に登録済みの場合はログインするだけ) RankingManager.Instance.SighUp ("たかし"); //ランキングID Score1 にスコア10を送る RankingManager.Instance.SendRanking (RankingManager.RankingType.Score1, 10); //ランキング一覧ページを表示 RankingManager.Instance.ShowRanking (); //ユーザ名をたけしに変更する RankingManager.Instance.ChangeName ("たけし"); //ランキングID Score1 に参加しているユーザ数を取得 int joinCoint = RankingManager.Instance.JoinCountList [RankingManager.RankingType.Score1]; //ランキングID Score1 での自分の順位を取得 int myRank = RankingManager.Instance.MyRankList [RankingManager.RankingType.Score1]; //ランキングID Score1 での自分のハイスコアを取得 int highScore = RankingManager.Instance.HighScoreList [RankingManager.RankingType.Score1];
なお、現状このRankingManagerはスコアが整数の場合にしか対応していないのでご注意ください!
コード説明
続いて、項目ごとにRankingManagerのコード説明です!
サインアップ、ログイン
サインアップとログインは以下の通り、LobiCoreAPIBridge.SignupWithBaseNameを使って行います。
ユーザ登録が済んでいなければサインアップ、済んでいればログインしてくれるので、楽でいいですね。
LobiCoreAPIBridge.SignupWithBaseName(name, "SignupWithBaseNameCallback", userName);
nameがコールバックメソッドが実装されているスクリプトが付いているGameObject名、
"SignupWithBaseNameCallback"が結果が返って来るコールバックメソッド名、
userNameがユーザの名前です。
コールバックメソッドは以下のようになっていて、
初期スコアを全ランキングに送信しています。
//サインアップ完了 private void SignupWithBaseNameCallback(string message){ //ユーザ登録が済んだら、デフォルト値をランキングに登録 foreach(RankingType rankingType in Enum.GetValues(typeof(RankingType))){ SendRanking (rankingType, RANKING_INITIAL_VALUE[rankingType]); } }
messageにはエラー文が送られてくる時もあるはずなので、
それに対応しなくてはいけないんですけどね……
なお、ログイン処理はStartで行っているので、特にログインを意識してする必要はありません。
初回起動時はユーザ名が登録されていないため、CanSignUpで弾かれログイン処理を行わないで、
ユーザ名を入力してもらった後にサインアップする必要があります。
スコア送信
スコアの送信は以下の通り、LobiRankingAPIBridge.SendRankingを使って行います。
/// <summary> /// ランキングにスコア送信 /// </summary> public void SendRanking(RankingType rankingType, int score){ if (LobiCoreBridge.IsReady ()) { LobiRankingAPIBridge.SendRanking (name, "SendRankingCallback", rankingType.ToString (), score); } else{ SighUp (SettingDataManager.Instance.LoadUserName ()); } }
nameがコールバックメソッドが実装されているスクリプトが付いているGameObject名、
"SendRankingCallback"が結果が返って来るコールバックメソッド名、
rankingType.ToString ()がランキングのID、
scoreが登録したいスコアです。
LobiCoreBridge.IsReady ()でログイン済みか確認できるので、
ログインが済んでいない場合はログイン処理を行っています。
この場合、ログイン後に再度スコア送信を行っていないので注意が必要です。
コールバックメソッドでは
ランキング情報を取得するメソッドを実行しています。
//スコア送信後 private void SendRankingCallback(string message){ //ランキング情報を取得し、順位等を確認 GetRankingData (); }
messageにはエラー文が(ry
ランキング情報取得
ランキング情報の取得は以下の通り、LobiRankingAPIBridge.GetRankingを使って行います。
以下の例では自分のランキング情報だけを取得しています。
/// <summary> /// ランキングデータを取得する /// </summary> private void GetRankingData(){ foreach(RankingType rankingType in Enum.GetValues(typeof(RankingType))){ LobiRankingAPIBridge.GetRanking ( name, "GetRankingCallback", rankingType.ToString(), LobiRankingAPIBridge.RankingRange.All, LobiRankingAPIBridge.RankingCursorOrigin.Top, 1, 1 ); } }
nameがコールバックメソッドが実装されているスクリプトが付いているGameObject名、
"GetRankingCallback"が結果が返って来るコールバッ用メソッド名、
rankingType.ToString ()がランキングのID、
LobiRankingAPIBridge.RankingRange.Allが取得する範囲
LobiRankingAPIBridge.RankingCursorOrigin.Topが取得する基準
一つ目1が何位から取得するか、
二つ目の1が何人取得するかです。
なお、RankingRangeとRankingCursorOriginの他の設定値は以下の通りです。
https://github.com/kayac/Lobi/wiki/iOS-Implement-LobiRankingSDK-Unity
LobiRankingAPIBridge.RankingRange.Today(本日)
LobiRankingAPIBridge.RankingRange.Week(今週)
LobiRankingAPIBridge.RankingRange.All(全体)
LobiRankingAPIBridge.RankingRange.LastWeek(先週)LobiRankingAPIBridge.RankingCursorOrigin.Top(先頭)
LobiRankingAPIBridge.RankingCursorOrigin.Self(自分中心)
コールバックメソッドでは
取得したJsonを分解して特定の情報を保存しています。
Jsonの形式はこちらで確認出来ます。
//ランキングデータ取得のコールバック private void GetRankingCallback(string message){ JSONObject json = new JSONObject(message).GetField("result"); //取得したデータのランキングID string rankingID = json.GetField ("ranking").GetField("id").str; RankingType rankingType = TypeData.KeyToType<RankingType>(rankingID); //ランキング参加人数 string joinCountStr = json.GetField ("ranking").GetField("join_count").str; _joinCountList [rankingType] = int.Parse (joinCountStr); //自分の順位 string myRankStr = json.GetField ("self_order").GetField("rank").str; _myRankList [rankingType] = int.Parse(myRankStr); //ランキングに登録されている自分のハイスコア string highScoreStr = json.GetField ("self_order").GetField("score").str; _highScoreList[rankingType] = int.Parse(highScoreStr); //ランキング情報を取得し、自分の名前が変更されている場合があるので、登録しなおし string userName = json.GetField ("self_order").GetField("name").str; if(!string.IsNullOrEmpty(userName)){ SettingDataManager.Instance.SaveUserName (userName); } }
取得したユーザ名を保存しているのは、Lobi側でユーザ名の変更ができるので、
アプリ側で保存しているユーザ名と一致させるためです。
ユーザ名変更
ユーザ名変更は以下の通り、LobiCoreAPIBridge.UpdateUserNameを使って行います。
LobiCoreAPIBridge.UpdateUserName (name, "ChangeNameCallback", userName);
nameがコールバックメソッドが実装されているスクリプトが付いているGameObject名、
"ChangeNameCallback"が結果が返って来るコールバックメソッド名、
userNameがユーザの名前です。
コールバックメソッドでは特に何もしていません。
//ユーザ名変更完了 private void ChangeNameCallback(string message){ }
なお、コールバックメソッド名を指定しなかったり、メソッド自体を作らないと
iOSではユーザ名の変更が成功しませんでした。
ランキング一覧を表示
ランキング一覧を表示は以下の通り、LobiRankingBridge.PresentRankingを使って行います。
LobiRankingBridge.PresentRanking ();
楽!!
おわりに
記事にすると、コードを見返す事になるので、修正したい部分が出てきますね。
修正するかどうかは別だがな!
次回はきっとプレイ動画編です!
追記:書きました!