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にデータを預ける場合、最初に初期データを保存(初期化)しておきます。
※以降のスクリプトは分割して掲載していますが、全て同一のスクリプトファイルに記述しています。
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】3Dアクションゲームを作ろう!#7 ステージの作成(Skybox・落下判定)
▶
【Unity】3Dアクションゲームを作ろう!#8 ステージの作成(スイッチ・扉)
▶
【Unity】3Dアクションゲームを作ろう!#9 プレイヤーのHP管理
▶
【初心者Unity】JsonUtilityクラスでJSONを扱う方法
▶
【初心者Unity】スクリプトからコンポーネントを追加する方法
ゲーム制作関連のオススメ連載リンク
とっても手軽なゲーム制作体験!
Unityゲーム開発基礎
実際のリリースゲームを題材にしたハンズオンゲーム制作連載
実践unityゲーム開発