FirebaseとUnityの連携 入門（Cloud Storage編）

この記事は、[Firebase Advent Calendar 2019](https://qiita.com/advent-calendar/2019/firebase)の15日目の記事です。 

## 概要

以前、『[FirebaseとUnityでアプリ開発（ハンズオンみたいなやつ）](https://qiita.com/gremito/items/dfb2080300955c5d5768)』という記事をアップし、そこでFirebaseとUnityの連携方法を簡単に解説しました。

今回は特定のFirebaseのサービスを扱う際、まずは0から作るのではなく、サンプルを活用してFirebaseとUnityの連携をいち早く体験できる方法のご紹介です。

Unityの場合、AssetBundleをサーバに配置し、`UnityWebRequest.Get`などを使ってAssetBundleデータをダウンロードしますよね。
そのため今回は、[Cloud Storage](https://firebase.google.com/docs/storage/unity/start?hl=ja)を触ってみることで、ゆくゆくAssetBundleデータをFirebaseで管理する設計イメージができないか、まずはやってみましょう。

## 環境

* MacBookPro Mojave 10.14
* Unity 2019.2.9f1
* Firebase for Unity 6.3.0

## セットアップ

まずは、[導入方法](https://qiita.com/gremito/items/dfb2080300955c5d5768#firebase-unity-sdk%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)を参考にFirebaseとUnityの連携準備は済ませておきましょう。

そしてサンプルコードとして公式が用意している[firebase/quickstart-unity](https://github.com/firebase/quickstart-unity)の[Cloud Storage for Firebase Quickstart](https://github.com/firebase/quickstart-unity/tree/master/storage/testapp)を活用します。

一見、FirebaseもUnityも古いバージョンで作られていますが、大幅な変更がない最低限の機能はちゃんと動くので、本格的なアプリへの導入の際の設計・開発で参考にしていきましょう。

### Unity側の調整

ですが、活用すると言っても[quickstart-unity/storage/testapp/Assets/Firebase/Sample/Storage/UIHandler.cs
](https://github.com/firebase/quickstart-unity/blob/master/storage/testapp/Assets/Firebase/Sample/Storage/UIHandler.cs)だけ扱うので、クラス名だけ変えてC#スクリプトを作成し、コピペしましょう。

その後、コピペして作ったC#を空のGameObjectにアタッチし、そのInspector上に表示されるGUISkin変数にGUISkinを作成してアタッチしましょう。

![スクリーンショット 2019-12-14 23.03.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/cea4530f-e106-1da8-fac2-843857e1abab.png)

また、カメラの調整を`Skybox`から`Solid Color`に変更して、サンプルが分かりやすいように調整しておきましょう。

![スクリーンショット 2019-12-14 23.14.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/a3670719-35d8-60b7-1d07-c4b19278c4ac.png)


### Cloud Storageの設定

次にFirebaseコンソール側の作業になります。

Storageのメニューを開き、事前に画像などをアップし、詳細上から画像のリンクをコピーなどしてメモしておきましょう。

次にルールの設定です。
公式の『[Storage セキュリティ ルールを使ってみる](https://firebase.google.com/docs/storage/security/start?authuser=0#sample-rules)』に各ルールの設定サンプルがあり、[Auth](https://qiita.com/gremito/items/dfb2080300955c5d5768#auth)を扱わないので今回は公開のルールを扱います。
この公開のルールは、誰でも読み込みと書き込みが可能な設定なので作業終了後に設定を戻しておくようにしておきましょう（自己責任でお願いします🙏）。

<img width="1461" alt="スクリーンショット 2019-12-14 23.04.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/0534b17b-0f1a-7d26-6ba7-5da06abc0175.png">
<img width="1100" alt="スクリーンショット 2019-12-14 23.08.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/66cc8231-0d0f-871f-3228-48f6d0fed0bc.png">
<img width="1248" alt="スクリーンショット 2019-12-14 23.08.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/7c073ba7-a57d-89d1-c9f7-68a10fd49e2c.png">


## 実行

`Local File Path`と`Storage Location`の設定を先ほどメモした内容に書き換えて`Download Bytes`/`Download Stream`/`Download to File`の各ボタンを押してみると以下のようになります。

成功せず、もしパーミッションエラーで403がある場合は、おそらくルールの設定変更忘れだと思います。
また、`Local File Path`の変更を忘れているとデフォルトで設定されている`downloaded_file.txt`の名前でファイルが生成されてしまいます。

![スクリーンショット 2019-12-14 23.15.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/a6a4e08a-7806-514c-d0d2-3347df509879.png)
![スクリーンショット 2019-12-14 23.15.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/541bb20e-1965-7089-a4c3-0037b30aba6c.png)
![スクリーンショット 2019-12-14 23.15.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/260bd8d0-9e7c-83d8-7aae-2f05a2f7785b.png)



## さいごに

あとはAssetBundleさえ準備できればいつでもFirebaseで管理できるようになりそうですね。

ちなみにCloud Storageのファイルサイズには上りと下りで制限があるのか気になりましたでしょうか。
『[Storage セキュリティ ルールを使ってみる](https://firebase.google.com/docs/storage/security/start?authuser=0)』を読んでいるとルール側でデータサイズを指定して上り下りの制御ができるようです。

ちょっと調べてみたところデータサイズの制限は特にないようなので、普通にAssetBundleのサーバとして扱えそうですよね＾＾