Unityゲーム開発でオンラインランキング機能を加えたいとき、naichilabさんが作ったunity-simple-rankingを使えばとても簡単にランキング機能を実装できます。
基本的には下記のページの手順通りに設定していけば問題なく実装はできると思うのですが、時間の書式設定でハマったので設定方法を共有します。
ハマったポイント
unity-simple-rankingでは、数値をスコアとして扱うNumberと時間をスコアとして扱うTimeでランキングを実装することができます。
NumberやTimeの書式を指定する際に「3.unity-simple-rankingの設定」で説明されているCustomFormatを指定する必要があります。
僕が作ったゲームの場合は、float型でカウントした時間を「mm:ss」の形式で表示させる必要がありました。
Custom Formatを指定には以下を参考に指定してくださいと書かれていましたが、見ても理解できず時間を「mm:ss」形式で表示する方法がわからずハマってしまったんですよね。(かなり初歩的なところだと思いますが)
書式を指定して数値を文字列に変換する – .NET Tips (VB.NET,C#…)
日時(DateTimeオブジェクト)を文字列に変換する – .NET Tips (VB.NET,C#…)
前回のunity1weekではこれを解決するのに謎に時間がかかったので、解決方法を共有します。
時間を「mm:ss」形式でランキングに表示させる方法
時間はfloat型の変数でカウントしているとします。
TypeをTimeに設定した場合は以下のように呼び出せばOK。
// Type == Time の場合
float millsec = 123456.0f;
System.TimeSpan timeScore = new System.TimeSpan (0, 0, 0, 0, millsec);
naichilab.RankingLoader.Instance.SendScoreAndShowRanking (timeScore);
具体的な例では、float型の変数を時間としてカウントアップする場合は以下のようなプログラムになると思います。
//時間(秒)を格納する変数
float countTime = 0.0f;
void Update()
{
//毎フレームTime.deltaTimeを加算
countTime += Time.deltaTime;
}
この場合は、秒をミリ秒に直すためにfloat型の変数countTimeに1000をかけてあげればいいです。
System.TimeSpanの最後の引数はint型を入れる必要があるのでint型に変換してます。
// Type == Time の場合
System.TimeSpan timeScore = new System.TimeSpan (0, 0, 0, 0, (int)countTime * 1000);
naichilab.RankingLoader.Instance.SendScoreAndShowRanking (timeScore);
これでTimeSpan型に変換ができるので、あとはRankingInfoを開いてInspecterのCustom Formatを「mm:ss」に設定すれば設定完了です。

設定自体は簡単でしたね。
書いてて思い出しましたが、どうやらfloat型の時間をミリ秒に直すところが間違っていたみたいでした。

プログラムが間違えているのか、Custom Formatの指定が違っているのかが
わからなくて困ってたよ…。
ミリ秒まで表示させたい場合
より細かい時間をランキングに表示させたい場合は以下のように設定すればいいです。

同じように「時:分:秒:ミリ秒」は「hh:mm:ss:fff」というふうにCustom Formatに書けばいいってことですね。
はー、簡単簡単。
まとめ
unity-simple-rankingで時間を指定の表示形式で表示させる場合は、以下を覚えていればOKです。
・時間をTimeSpan型に変換する(秒をミリ秒に変換することを忘れない)
・「時:分:秒:ミリ秒」はCustom Formatに「hh:mm:ss:fff」と指定する
前回unity1weekで馬鹿みたいに時間使ったので、みなさんはこんなところで躓かないようにしましょう。
コメント