unityroomでハイスコア、タイムアタックのランキング機能を付ける(この記事の内容はニフクラのサービス終了により使えなくなりました)

# はじめに
基本的にはここを読めば作れます↓
https://blog.naichilab.com/entry/webgl-simple-ranking

ただし、初心者にとっては結構むずかしいので、ハマりやすいポイントを解説します。

# 記事本編 1.～3.を進める
記事に書いてある通りに進めてください。
間違えやすい注意事項を補足説明します。
### 1.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/3adc4f50-aa47-4efb-df5f-81efd885825b.png)
何故かこの「1.下記記事を参考に....」を読み飛ばして進めてしまうひとが居ます。
必ず **先にやって** おいてから「2.」に進んでください。

**「APIキーの設定とSDKの初期化」** まで進めてください。
※※そこから先の「サンプルコードの実装」はやらなくていいです！！※※

### 2.パッケージのインポート
「2.パッケージのインポート」以降の作業を進めましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/c084c38c-bba8-e90a-b0de-6fe0aec1bffe.png)

#### SDKのダウンロードってどれだよ？
確かにGitHubに馴染みないひとにはわかりにくいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/970dc7c2-b06f-4cea-c4a7-94e98fe62aca.png)
ここをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/6f49ae53-bf76-6fa7-190d-fec145973acb.png)
.zipファイルを解凍して、NCMB.unitypackage をインポートしてください。

### 3.unity-simple-ranking の設定
**「EventSystem」** がhierarchy上に存在しない場合は必ず作ってください！
(テキストやボタン等のUIを作っていれば自動的に作られています)

### 4.呼び出す
ゲームオーバーやゲームクリア時に次の1行を呼び出してください
#### コード例
```CSharp:     
        // 引数に渡したスコアの値をハイスコアとランキングに登録を申請して、ランキングボードを表示
        // ※int型の変数 score には点数が入っているものとする
        naichilab.RankingLoader.Instance.SendScoreAndShowRanking(score);
```
#### ありがちなミス
##### 毎フレームランキング画面を呼んでしまう
ゲームオーバーやゲームクリアの条件を満たしたときに毎フレーム呼んでしまいがちです。
ランキング画面が固まってしまいます。
スクリプトを工夫して、1回だけしか呼び出さないようにしましょう。

##### Time.Scale を0にしてしまってランキング画面が固まる
ゲームの進行を止めたくてやってしまいがちです。
名前の入力を受け付けなくなってしまうので、別の手段でゲームを止めましょう。

##### リセットキーの暴発
Rキー等、何らかのアルファベットキーにリセット機能を付けている場合は注意が必要です。
名前に「R」を含むひとが名前を入力すると、ゲームがリセットされてしまってスコアが消えてしまう……っというミスをやりがちです。
リセット機能を無効にしてからランキング画面を呼び出しましょう。

# Custom Formatについて
### ハイスコアの例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/ae730e00-c402-8b42-6fec-367c49f4fb91.png)

※一般的なハイスコアの場合
Order(順番)は
「Order By Desceding(降順)」にしてください。
（デフォルトだと昇順になってしまっています）
「昇順」のままだとユーザーが折角ハイスコアを更新してもハイスコアを送信できないので注意してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/f3297a7a-56f6-7a98-f3a8-c20fc5b1f194.png)

### ハイスコアの例2
####億####万####円
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/95bae41a-67d0-0a06-7fe2-007fa49f90de.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/93c0894a-3e48-8780-2ba0-b9bc2d0f7815.png)

### タイムアタックの例
#### 実装例
```CSharp:GameManager.cs
using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class GameManager : MonoBehaviour
{
    private float countUp; // 時間カウントアップ用変数
    public float countUpMax = 180f; // タイムアップする時間

    void Update()
    {
        countUp += Time.deltaTime; // 1秒間に約1溜まる
        if(countUp >= countUpMax)
        {
            countUp = countUpMax;
            // タイムアップ(時間オーバー)の処理
        }
    }

    // タイムアタックランキングの表示(ボタンやゲームオーバー等で外部から呼び出す)
    public void ShowTimeScoreRanking()
    {
        // ※単位がミリ秒なので1000倍にしてfloat型をint型に型キャスト
        var millsec = (int)(countUp * 1000);
        var timeScore = new System.TimeSpan(0, 0, 0, 0, millsec);
        naichilab.RankingLoader.Instance.SendScoreAndShowRanking(timeScore);
    }
}
```

「mm分ss.ff秒」と書いた場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/636fb0c0-1458-852e-78bd-fad1a45f2e1d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/5bfa6130-43e0-c4be-da81-a62535c53fd1.png)


# ハイスコアの編集、削除
チーターや気に食わない人間のスコアを改ざんしたり削除可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/48d5b49d-b8cf-15a1-e889-d7fcb464b73c.png)