Firebase-Unityを使って簡単なChatを作ってみた話

#概要
UnityにFirebaseのRealtimeDatabaseを導入して簡単なchatを作ってみた。
Unity版のFirebaseは、2016年１１月6日現在、まだ完成していないようです。
よって、製品版では使わないほうが良いとのことです。
あくまでも自己責任でお願いします。

#RealtimeDatabaseとは
DBに書き込んだ内容が、DBに接続しているPlatform(Android端末,ios端末など)に
即座に反映されます。
リアルタイムに会話するなどのchatアプリを作るときに導入すると良いと思います。

#手順
(1)Firebaseのアカウントを作る
以下のサイトにてFirebaseのアカウントを作ります
https://console.firebase.google.com/

(2)プロジェクトの作成を行う
私の場合は、IOSを選択しましたが、Unityから使う分には問題なかったです。

<img width="870" alt="スクリーンショット 2016-11-06 21.54.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/46535/40305501-78e8-33a7-e166-696cd841dce3.png">

(3)GitHubよりfirebaseをCloneする
https://github.com/firebase/Firebase-Unity

(4)firebase.unitypackageをimportする
Unityプロジェクトを作成し、firebase.unitypackageをimportします。

こんな感じになります。
<img width="283" alt="スクリーンショット 2016-11-06 21.58.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/46535/b9903605-fef5-4e86-28b6-ba2efcb83726.png">

この時点で、firebaseを導入できたことになります。

(5)Firebase-Unityのサンプルコードを元に実装してみる
Firebase-Unityにサンプルコードが載っています。
正しく動くとDataBaseの管理画面に、DBに送った内容が反映されます。

以下のような感じに反映されます。
<img width="939" alt="スクリーンショット 2016-11-06 21.39.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/46535/ad0a0b05-4243-e097-62d2-79c6586f7748.png">

導入手順は以上です。

#Chatを作ったときのサンプルコード

<img width="450" alt="スクリーンショット 2016-11-06 21.38.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/46535/0fb8d937-63c1-d03f-cef6-90700ae6f8fc.png">

![IMG_8224.JPG](https://qiita-image-store.s3.amazonaws.com/0/46535/6890f595-fb6c-75b3-11a7-196c5649c738.jpeg)
Unityプレイヤで発言した内容が、１秒以内にAndroid端末にも反映されました！


サンプルコード全体

```
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class FireBaseSample : MonoBehaviour {

	IFirebase root;
	IFirebase foo;
	public string userName = "userName";
	public string message = "message";
	public string output = "";

	void Awake() {
		root = Firebase.CreateNew("https://your-project-id.firebaseIO.com");
		foo = root.Child("root");
		//foo.Child (System.DateTime.Now.ToString ("yyyy-MM-dd-HH-mm-ss")).SetValue ("Awake");

	}

	void OnEnable() {
		foo.ChildAdded += FooChildAdded;
	}

	void OnDisable() {
		foo.ChildAdded -= FooChildAdded;
	}

	//DBに変更があったときに呼び出される
	void FooChildAdded (object sender, FirebaseChangedEventArgs e) {
		//Debug.Log("FooChildAdded: " + e.DataSnapshot.Key);
		//Debug.Log("Message: " + e.DataSnapshot.Child("Message").StringValue	);

		output +=  string.Format("{0}\nName:{1} Message:{2}", e.DataSnapshot.Key,e.DataSnapshot.Child("UserName").StringValue, e.DataSnapshot.Child("Message").StringValue);
		output += "\n";

	}

	void OnGUI() {
		if (GUI.Button (new Rect (210, 10, 150, 50), "Send")) 
		{
			print("Send!");
			string timestring = System.DateTime.Now.ToString ("yyyy-MM-dd-HH-mm-ss-zzz");

			//このやり方だと、FooChildAddedが呼び出されたとき、２つ以上の要素が取得できない
			//よってその下のjsonにして送るようにする
			//foo.Child (System.DateTime.Now.ToString (timestring)).Child ("UserName").SetValue (userName);
			//foo.Child (System.DateTime.Now.ToString (timestring)).Child ("Message").SetValue (message);

			//子項目は、一度にセット
			Dictionary<string, string> dic = new Dictionary<string, string>();
			dic ["UserName"] = userName;
			dic ["Message"] = message;

			var json = MiniJSON.Json.Serialize(dic);

			//Firebaseに登録する
			foo.Child (System.DateTime.Now.ToString (timestring)).SetJsonValue (json);
		}

		//ユーザ名セット
		userName = GUI.TextField(new Rect(10, 10, 200, 20), userName, 25);

		//メッセージ
		message = GUI.TextField(new Rect(10, 40, 200, 20), message, 25);

		//Output欄
		output = GUI.TextField(new Rect(10, 80, 400, 500), output);


	}


}

```