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


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


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

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

※使用しているUnityのバージョンは5.3.4です。

Kii Cloud へのセーブ & ロード


■Kii Object について

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

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

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

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

■KiiObjectの初期化

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

	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クラスを使用します。

	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を検索してから値を取り出します。

	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新着記事
【簡単!】Unity2Dでクリックした方向に弾を飛ばすサンプル
  • このエントリーをはてなブックマークに追加

PAGE TOP