(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!

    

UnityでLobiを使う、ランキング編【Unity】【Lobi】


このエントリーをはてなブックマークに追加


この記事でのバージョン
Unity 4.6.3f1
Lobi 5.4.6

はじめに

前回の導入編に引き続き、今回はランキング編です!



上記の導入編が済んでいる事が前提ですのであしからず!


ランキング作成

まず、Lobi Developersにログインし、任意のアプリページから

ランキング機能をONにして、ランキングの追加を行います。


f:id:kan_kikuchi:20150515091112j:plain


ランキングは複数作れますし、追加や削除も簡単です。


RankingManager

次に、Lobiランキング用の自作マネージャクラスをご紹介!

とりあえずこれがあれば、ランキング周りの大体の事は出来るはずです。


また、SingletonMonoBehaviourというクラスを継承しているので、

そんなの知らない!って方はこちらもご確認ください。


さらに以前紹介したTypeDataというクラスも使っているので、

こちらも要確認!


さらにさらにJsonを扱うためJsonObjectというクラスも使っております。

それはこちらで。



コールバックでエラーハンドリングしてなかったり、

拙い部分が多々あるので、使う人は自己責任でお願いします。


RankingManager設定

まず、上の方にあるenum RankingTypeにランキングIDを設定します。

上記の例では、Score1とScore2という二つのランキングがある事になります。


ランキングIDはLobi Developers上で作成したランキングページを開き、

ランキング設定編集ボタンを押し、


f:id:kan_kikuchi:20150522064809j:plain


開いた設定ページ内で確認出来ます。


f:id:kan_kikuchi:20150522065041j:plain


次に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 ();


楽!!


おわりに

記事にすると、コードを見返す事になるので、修正したい部分が出てきますね。

修正するかどうかは別だがな!


次回はきっとプレイ動画編です!


追記:書きました!