UnityでmBaaSを使ってみる

##やる事
クライアントしか出来ないプログラマーの救世主、
mBaaSを使って自前のDB作って、ネットワーク通信してデータを取ってくる！

###使用サービス
- [Parse]("https://www.parse.com/")

UnityのSDKが標準で準備されてる！便利！！

##準備
Parseのシステムは無料〜扱うデータ容量やアクセス数によって課金するタイプだけど、個人で使う分にはそうそう上限まで行かないんじゃないかな〜と思う。
使用するにはまず

- とにもかくにもアカウントを作る。
- アプリケーション毎にID郡が必要になるので、アプリケーションの登録を行う。
- Unity SDKをDLしてUnityのプロジェクトに突っ込む。

 ![スクリーンショット 2014-09-24 11.06.09.png](https://qiita-image-store.s3.amazonaws.com/0/45511/bc20383d-636c-ece5-a1c2-25348137b84a.png "スクリーンショット 2014-09-24 11.06.09.png")

- Empty GameObjectを作って、Componentに上で追加したライブラリのスクリプト(ParseInitialzeBehaviour)を付ける。
![スクリーンショット 2014-09-24 11.09.24.png](https://qiita-image-store.s3.amazonaws.com/0/45511/76e6487e-569e-13e0-dfe3-f20ff6a2bc59.png "スクリーンショット 2014-09-24 11.09.24.png")

- 上記のスクリプトのパラメータにある **ApplicationID** と **.Net Key** をParseのアプリケーションのページから取って来て、貼付ける

##データ登録
DBにデータを登録するにはUnity側からスクリプト経由で登録する方法と、Parseのアプリケーションページから登録する方法の２つ

###Parseのアプリケーションページから登録

Dashboradで対応するアプリケーションのCoreを選択

![スクリーンショット 2014-09-24 12.09.57.png](https://qiita-image-store.s3.amazonaws.com/0/45511/5745f09c-64ba-f240-4df0-ff7c282e3add.png "スクリーンショット 2014-09-24 12.09.57.png")

左の **Add Class**を選択して、クラスの種類と名前を決める

![スクリーンショット 2014-09-24 12.12.06.png](https://qiita-image-store.s3.amazonaws.com/0/45511/37fe74c3-f062-3aaf-1eea-bd8f0013f63a.png "スクリーンショット 2014-09-24 12.12.06.png")
基本的にはCustomで良い。
テーブルリストページみたいなところに遷移するので、後は **+ Cal** でカラム項目追加して、 **+ Row** で実際にデータ入れる行を追加して行く

カラムを追加する時に型を聞かれるので、ここでRelationを選択するとParse上で作った他のクラスを選択する事が出来る
![スクリーンショット 2014-09-24 12.18.49.png](https://qiita-image-store.s3.amazonaws.com/0/45511/8a453ec7-1b7d-24ef-8ad8-cfee3a137ab2.png "スクリーンショット 2014-09-24 12.18.49.png")

Relation使って登録するとこんな感じになる
![スクリーンショット 2014-09-24 12.21.46.png](https://qiita-image-store.s3.amazonaws.com/0/45511/7a865619-96d6-4913-016f-7c4046181bba.png "スクリーンショット 2014-09-24 12.21.46.png")
この図では、WaveクラスにEnemyクラスのRelationを作っている。
注意しないと行けないのは、Relationでデータを登録する場合、 **View Relations** からRelation先のクラスに移動して、Rowデータを登録しないと、上手く紐付かない！
![スクリーンショット 2014-09-24 12.27.07.png](https://qiita-image-store.s3.amazonaws.com/0/45511/4d9b5b15-b262-fc77-0ff2-9beb17e74be2.png "スクリーンショット 2014-09-24 12.27.07.png")
**View Relations** から遷移すると左の欄に青文字で紐付いているカラム名が表示される。

###スクリプトからデータ登録
色々方法があるようですが、一番簡単なのは、ガイドにも書いてある

```c#
using Parse;

```

```c#
ParseObject testObject = new ParseObject("TestObject");
testObject["foo"] = "bar";
testObject.SaveAsync();
```

これで、ParseのCoreData内にTestObjectというクラスが作られ、
そのクラスにfooカラムが追加され、fooカラムにbarという値が入ったRowが一つ出来上がります。

これでデータ登録は完了です。

##データ読み込み
```c#
using Parse;
```
```c#
ParseQuery<ParseObject> query = ParseObject.GetQuery("Wave");
query.FindAsync().ContinueWith(t1 => {
	IEnumerable<ParseObject> r1 = t1.Result;
	List<List<Vector2>> list = new List<List<Vector2>> ();
	foreach(ParseObject r in r1) {
		ParseRelation<ParseObject> enemies = r.Get<ParseRelation<ParseObject>>("enemy");
		enemies.Query.FindAsync().ContinueWith(t2 => {
			List<Vector2> positions = new List<Vector2> ();
			IEnumerable<ParseObject> r2 = t2.Result;
			foreach(ParseObject po in r2) {
				positions.Add (new Vector2 (po.Get<float>("x"), po.Get<float>("y")));
			}
			list.Add(positions);
		});
	}
});
```
上記はWaveクラスにある全Rowデータからenemyカラムの情報を取得している記述です。
クラスの中にRelationタイプのカラムは都度取得しに行かなければいけない仕様のようですので、DB設計する時はなるべくRelationが続かない設計にするとセッション数の減少、処理速度の短縮になります。

```c#
ParseQuery<ParseObject> query = ParseObject.GetQuery("GameScore");
query.GetAsync("xWMyZ4YEGZ").ContinueWith(t =>
{
    ParseObject gameScore = t.Result;
});
```
こちらのように、クラス指定して、RowのObjectIDを狙い撃ちで取得する事も出来ます。

##まとめ
データ読み込み時にちょっと癖のあるParseSDKですが、サービス全体ではとても良く出来ていますね。
データ登録も簡単に行えるし、何よりiOS/Android/Unityはもちろん、
多くの他の言語でも標準ライブラリを提供しているので、少人数・個人で複数環境でアプリを開発したい場合に便利です！！
[こちら]("http://dev.classmethod.jp/cloud/parse-introduction-1/")にも分かりやすい記事があったので、合わせて参照するとより理解が早いと思います。