読者です 読者をやめる 読者になる 読者になる

KazumaLab.

流行りとリラックマと嵐が大好きです。

UnityでFirebaseを使ってデータの保存を行う

Unity

最近自分の中でFirebaseを使うことが多くて
UnityからもAssetを使えばかんたんにできるそうなのでやってみました。
まだ自分でも不明点みたいなのがいっぱいなので間違っていればご指摘ください。

f:id:kazumalab:20161031182809p:plain

* Firebase for Unityはまだアップデートされてないみたい

Cloneしてきて、インポートしてもエラーで使えません。
今回はそれは使わずにAssetを使ってみました。

Simple Firebase Unity

Asset Store

こちらを使います。

f:id:kazumalab:20161031151508p:plain

インポートした時はこんな感じです。
基本的に使い方は簡単ですが、どれを使っていのかはじめはわかりませんでした。

基本的には2パターン使ってFirebaseにデータを投げます。


AddQueueメソッドを使う

これはまとまったデータを投げるときなどに便利です。
個人的にはこちらを使って行きたい。。。
理由は後に説明します。

Child & Pushメソッドを使う

Jsonの子どもをGetしてきてそのValueとしてデータを投げる方法
基本的にデータのやり取りが頻繁な場合はこちらを使います。
こっちを最初使っていてコケた。

初期準備

一つのFirebaseを使う場合は基本的にシングルトンで書いてもいいと思います。
まずはなんにも使わず(Observerを使えば通知ができる)書いていきます。

ここまでで何か空のゲームオブジェクトにアタッチすれば他のクラスから呼び出して使うことができます。

Child & Pushを使ってみる

こんな感じでPushできるようにします。
f:id:kazumalab:20161031162006g:plain
ちゃんとPushが成功すればSuccessLogがでます。

ちゃんとこんな感じでFirebaseで確認できます。
f:id:kazumalab:20161031162144p:plain

コードはこんな感じ!めっちゃ簡単!

// NetworkTest.cs
public InputField input;

public void PushText () { // Attach Button OnClick.
	if (input.text != "") {
		NetworkSingleton.Instance.firebase.Child ("message", true).Push ("{\"name\": \"kazuma\",\"text\": \""+input.text+"\"}", true);
		}
}

ただここで気になったのはJsonなのですが
messageの下に文字列が入ってるのが好きではないのでChild & Pushはあまり使うのは。。。とおもってしまいました。
もしいい方法があれば教えて下さい。

AddQueueメソッドを使う

AddQueueSet

一番はじめにデータをセットする際に利用します。
これを使うとデータが置き換わるので追加する場合はデータを取ってきてクライアント側でデータを追加してPushする必要があります。

AddQueuePush

まとめてChild & Pushを行うと考えてもいいと思います。
ただコレもPushした場合気になっていた部分の文字列Keyになります。

AddQueueUpdate

これがいいかなーって思ってます。
Updateなんですが、Create or Updateみたいな感じかと思います。

今回はAddQueueUpdateを使って書いていきます。

こんな感じでまとめてプッシュします。
f:id:kazumalab:20161031174708g:plain

コレを使うと謎のキーが入りません。
なのでいい感じ!
f:id:kazumalab:20161031175320p:plain

Testコードを大幅に書き換えます。

NetworkSingleton.csにもFirebaseQueueのインスタンスを追加します。

public FirebaseQueue firebaseQueue;
// method Awake. 
firebaseQueue = new FirebaseQueue();

Jsonデータを取ってくる場合

Firebase firebase = NetworkSingleton.Instance.firebase;
NetworkSingleton.Instance.firebaseQueue.AddQueueGet (firebase, "print=pretty");

あとはJsonを解析すればOKです。
ちょっとUnityだと面倒ですが。

MiniJsonとかここを参考に使うといいかもです。
qiita.com

補足

FirebaseObserverクラスがあると思いますが、Startしてデータが更新されるとコールバックによりデータを取ってくる事ができます。

こんな感じで更新されると自動的にメッセージを受信します。