Tips

UnityでKii Cloudを使ってハイスコアランキングを作ろう!#3 セーブ&ロード編
2016.11.17

UnityでKii Cloudを使ってハイスコアランキングを作ろう!#3 セーブ&ロード編

UnityでKii Cloudを使ってハイスコアランキングを作ろう!#3 セーブ&ロード編


前々回前回に引き続き、Unityでハイスコアランキングとか手軽に実装してみたい!
という方向けに、Kii Cloud を使用したデータの保存と検索機能の実装について紹介してきます。

今回は第3回目、セーブ&ロード編です。
KiiCloudへのデータのセーブとロード処理について、スクリプトメインで解説していきます。

※使用しているUnityのバージョンは5.3.4です。
[Unity_317×90]

Kii Cloud へのセーブ & ロード


■Kii Object について

Kii Cloud に保存されるデータのことをKii Object といいます。
この Kii Object は Bucket に保存されます。Bucket はバケツという意味で、Kii Object の入れ物として扱います。

■Bucket(バケット)について

Kii Object は、複数の Bucket を使って目的別で管理します。
Bucket は、スコープの違いから3つに分けることができます。
・アプリケーションスコープバケット
・グループスコープバケット
・ユーザースコープバケット
アプリケーションスコープは、ゲーム内の全てのユーザーが共有するデータを扱う場合に使用します。
グループスコープは、特定の範囲に属するユーザー間で共有されるデータを扱う場合に使用します。
ユーザースコープは、個々のユーザー単位のデータを扱う場合に使用します。

ハイスコアランキングを作成したい場合、全ユーザのハイスコアデータを集計し、開示するため、
アプリケーションスコープのバケットを使用します。

■KiiObjectの初期化

KiiCloudにデータを預ける場合、最初に初期データを保存(初期化)しておきます。
※以降のスクリプトは分割して掲載していますが、全て同一のスクリプトファイルに記述しています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private string myCharacterName = "testPlayer";
 
void InitHighScoreData() {
 
    // アプリケーションスコープBucketの作成(引数はバケット名)
    KiiBucket appBucket = Kii.Bucket("my_app_data");
 
    // バケットをKiiObjectに変換する
    KiiObject appDataObj = appBucket.NewKiiObject();
 
    // KiiObjectに、保存するデータをキーと値でセット
    appDataObj["CHARACTER_NAME"] = myCharacterName;
    appDataObj["HIGH_SCORE"] = 0;
 
    // KiiCloudにセーブ(通信が発生する)
    appDataObj.Save((KiiObject updatedObj, System.Exception e) => {
        if (e != null) {
            Debug.Log("ハイスコアデータの初期化に失敗しました" + e);
            return;
        }
        Debug.Log("ハイスコアデータを初期化しました");
    });
}

■KiiObjectのセーブ

2回目以降のセーブは、初期化したKiiObjectを検索して値を上書きします。
KiiObjectの検索は、KiiQueryを使用を使用します。
検索条件の設定は、KiiClauseクラスを使用します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
private int myHighScore = 7777;
 
void SaveHighScoreData() {
     
    KiiBucket appBucket = Kii.Bucket("my_app_data");
 
     
    // キャラクター名がバケット内で一意でないとデータが複数ヒットするため、注意!
 
    // バケット内を検索するためのKiiQueryを作成
    KiiQuery query = new KiiQuery(
        // 検索条件はKiiClauseクラスを使用して設定
        KiiClause.Equals("CHARACTER_NAME", myCharacterName)
    );
 
    // クエリーでApplication Bucket を検索して、上書き保存したいKiiObjectを取得
    appBucket.Query(query, (KiiQueryResult<KiiObject> result, System.Exception e1) => {
 
        if (e1 != null) {
            Debug.Log("Application Bucket からKiiObjectの取得に失敗しました" + e1);
            return;
        }
 
        // 検索結果は1件だけでも配列で返ってくるため、ループ処理
        foreach (KiiObject obj in result) {
 
            obj["HIGH_SCORE"] = myHighScore;
 
            // KiiCloudにセーブ
            obj.Save((KiiObject updatedObj, System.Exception e2) => {
 
                if (e2 != null) {
                    Debug.Log("Application Bucket へのハイスコアの保存に失敗しました" + e2);
                    return;
                }
                Debug.Log("Application Bucket にハイスコアを保存しました");
            });
        }
    });
}

■KiiObjectのロード

ロードは、セーブ同様KiiObjectを検索してから値を取り出します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public void LoadHighScoreData() {
 
    KiiBucket appBucket = Kii.Bucket("my_app_data");
 
    KiiQuery query = new KiiQuery(
        KiiClause.Equals("CHARACTER_NAME", myCharacterName)
    );
 
    appBucket.Query(query, (KiiQueryResult<KiiObject> result, System.Exception e) => {
        if (e != null) {
            Debug.Log("Application Bucket からハイスコアデータの取得に失敗しました" + e);
            return;
        }
 
        foreach (KiiObject obj in result) {
            // ロードの場合は、検索結果のKiiObjectから値を取得
            myHighScore = obj.GetInt("HIGH_SCORE");
        }
 
        Debug.Log("Application Bucket からハイスコアデータを取得しました");
        Debug.Log(myHighScore);
    });
 
}

■動作確認

シーンを作成して、Kiiにログインしたら、初期化 → セーブ → ロード の順で処理を実行しましょう。
それぞれのタイミングでKii Developer Portal の Application Bucket にデータが操作されていることを確認しましょう。

■ちょっと踏み込んだ話

上記のKii APIは、デリゲートとラムダ式を使用して記述されています。
正確には、通信処理のコールバックを引数(デリゲート)にラムダ式で渡しています。
KiiのAPIには非ブロッキングAPIとブロッキングAPIが用意されており、前者の使用が推奨されています。
コールバックを使用した非ブロッキングAPIは、KiiCloudとの通信中でも動作が固まることはありません。
メソッド呼び出し後、即座に次の処理に移行し、通信処理の結果は後ほどコールバックされます。

#3 セーブ&ロード編は以上です。
次回はいよいよ #4 ハイスコアランキングの作成編 です。
今回使用したKiiObjectの検索についてより詳しく解説していきます。

ゲーム制作関連のオススメ連載リンク

とっても手軽なゲーム制作体験!
Unityゲーム開発基礎

実際のリリースゲームを題材にしたハンズオンゲーム制作連載
実践unityゲーム開発

Recent News

Recent Tips

Tag Search