Edited at

FirebaseとUnityでアプリ開発(ハンズオンみたいなやつ)



++注意++

この記事は、Unity Fukuoka 14のセッション『FirebaseとUnityでアプリ開発(ハンズオンみたいなやつ)』の資料になります。


概要

Firebaseは、徐々にサービスが増えたり定期的にアップデートが行われておりますが、Webやゲーム以外のスマホアプリでは事例があるもの、ゲーム関連ではほぼほぼ事例がありません。

特に個人開発をやっているDeveloperがサーバレスに開発したいときに扱うことが多く、個人的にFirebaseは、大規模なゲーム案件よりもカジュアルゲームや個人開発など向けだなと感じています。

スクリーンショット 2019-06-16 21.35.26.png

Firebase Unity SDKでは、去年6月にCloud Functionsと先月5月にはCrashlyticsがサポートされ、Unityへの対応が手強くとても喜ばしいですが、やはりWebやゲーム以外のスマホアプリの事例からすると印象が薄いように感じてしまいます。

ちなみにFirebase Unity SDKでのCloud Functionsの活用は、以前、UNIBOOK10で執筆していた際にリリースされたため詳細をまとめております。



  • UNIBOOK9 - 第4章 「FirebaseとUnity」


  • UNIBOOK10 - 第2章 「Firebaseを用いたゲームアプリ開発」

アナリティクスRemote Configなどはよく扱われているものの、AuthFunctionsFirestorStorageなどの開発中にサーバが必要とする機能はあまり使われていないようだったのでUNIBOOK9での執筆やDevFest2018での登壇で知見をシェアしてきました。

スクリーンショット 2019-06-16 23.23.19.png

今回も同様にゲームやUnityコンテンツでもFirebaseは扱えるものだと知ってもらい、もっとUnityでFirebaseを使った事例が増えていったらイイなと考えています。

本セッションの目的は、ゲームやUnityコンテンツの開発時にFirebaseを活用したアプリ開発ができるようになるです。


環境


  • macOS Mojave(ver.10.14)

  • Unity 2019.1.0f2

  • Firebase Unity SDK 6.1.1


注意

本セッションでは、Firebase コンソールでのプロジェクトの作り方や扱い方は基本省いて進めていきます。

多くの方々が記事で解説していたり、公式のUnity プロジェクトに Firebase を追加するにガイドラインが解説されているため、そちらを参考に作業をお願いします。


Firebase Unity SDKについて

まずは、公式のUnity プロジェクトに Firebase を追加するを一通り読みましょう。

Firebaseの有名なことの1つが、公式ドキュメントが分かりやすくしかもローカライズされており至れり尽くせりです。

最悪何かのトラブルで機能が使えず開発が止まるようなことがあれば、公式のサポートがしっかり対応してくれるため使わないと損です。

把握したらFirebase Unity SDKのダウンロード

スクリーンショット 2019-06-17 0.37.33.png

次にFirebaseプロジェクトを作成した後にコンソール上からFirebaseのUnityアプリを追加設定

スクリーンショット 2019-06-17 0.40.06.png

といっても結局はiOS/Androidの設定が必須です。

これはFirebase Unity SDKがUnityのプラットフォームビルドでiOS/Androidにしかサポートしていないということです。

デスクトップにも対応していると公表していますが、あれは

スクリーンショット 2019-06-17 0.43.24.png

ここでダウンロードした.jsonファイルをUnityプロジェクトの中に入れておきましょう。

スクリーンショット 2019-06-17 0.43.47.png

スクリーンショット 2019-06-17 0.48.58.png

Firebase Unity SDKダウンロード後、解凍して中身を見ると.NET 3.5と.NET 4.xに対応した.unitypackageが入ってありますが、.NET3.5を使うメリットはもう無いのでNET 4.x対応の方を取り込んでいきましょう。

スクリーンショット 2019-06-17 0.59.37.png

スクリーンショット 2019-06-17 0.55.05.png

先ほどFirebaseプロジェクトにUnityアプリを作った際に設定したパッケージ名をBundle Identifierに設定しておきましょう。

スクリーンショット 2019-06-17 3.16.18.png

さて、これで準備が整いました。


解説するFirebaseのサービスについて

今回は、AuthStorageを解説していきます。

Authを選んだ理由は、各サービスで設定するルールでユーザー情報が無いとサービスを利用できなくさせる設定がデフォルトにあり、セキュリティ的にもユーザー情報がある前提で設計しておいた方がセキュアなのですが、そのユーザーを作ったり管理できたりする機能がAuthに備わってあります。

そのため必ず最初に押さえておくべきサービスなのです。

Storageは、リソース管理に最適なツールです。

ルールの設定をユーザー情報がある前提に設定しておけば、Unity上でしかUpload/Downloadできないようになるためとてもセキュアでセキュリティ対策コストが低いアプリ開発ができちゃいます。

またStorageは、URLでダウンロードできる設計になっているため、WWWやAssetBundleでリソースを取得することが可能であるため最初の方で慣れておくサービスのもう一つです。


Auth

Authは、いろんなサービスとの連携が可能であり、Web界隈でFirebaseが人気であるうちの1つです。

スクリーンショット 2019-06-17 5.47.21.png

スクリーンショット 2019-06-17 2.31.58.png

ところが、Unityで各サービスの連携を行うには、どうしてもネイティブプラグインを作る必要が発生してしまいます。

例えば、Twitter連携ですが、他の連携も同様に最初にアクセストークンなどを必要としており、その取得方法は、iOS/Androidのネイティブコードで解説されてあります。

スクリーンショット 2019-06-17 3.56.04.png

スクリーンショット 2019-06-17 3.56.33.png

スクリーンショット 2019-06-17 3.57.00.png

開発するアプリがSNS連携必須でなければ特に関係ないことですが、必須となるとかなり工数がかかってしまいます。これは開発手法の話でもありますが、最初からSNS連携を対応するよりも、まずは機能を扱えるようにして他に優先度の高い対応を進めるためにパスワードでの認証または電話番号での認証で仮実装すると良いでしょう。

そのため今回は、パスワードでの認証で解説を進めていきます。

公式に最低限扱う機能をピックアップして、それらのソースコードを載せているためそのまま参考にしちゃいましょう。

スクリーンショット 2019-06-17 3.57.27.png

次にFirebase コンソールのAuthenticationを開いて、ログイン方法からメール/パスワードを有効にしておきましょう。

スクリーンショット 2019-06-17 2.32.13.png

例えば、アプリ起動時にユーザー確認を処理する実装で、既存ユーザーだった場合は何もせずコンテンツを扱えうようにするが、nullでエラーの時はユーザー登録を完了しなければコンテンツが扱えないような設計を実装したとします。

スクリーンショット 2019-06-17 4.20.02.png

上記のようにエラー内容にどうしてエラーになったのか詳細が分かり、ContinueWithメソッドの引数Taskで処理結果がどんなステータスなのか把握できるため、ステータス違いで別機能を実装することがとても容易です。

スクリーンショット 2019-06-17 6.00.39.png

また、パスワード認証でのAuthでは、メールアドレス毎でユーザー管理になるため同一メールアドレスで別アカウントを作ることはできません。ですが、ここでPRIMARY KEY扱いになっているメールアドレスは、@が入った文字列であればなんでも登録できちゃう設計になってあります。

スクリーンショット 2019-06-17 4.29.02.png

そのため、メールアドレスのフィールドに入れる文字列は、裏側で勝手に作るようにし(例えばその時のユーザーの総数+1を@の前に付けてサービスドメインをメールアドレスのドメインにするなど)、パスワードのフィールドはUUIDを扱うよう設計すれば全て裏側で自動的にユーザーの登録と認証が可能です。

また、Firebase Admin SDKを用いてFunctionsまたは独自のサーバーとFirebase Authenticationを連携させることで開発しやすくなるサポートが付いてきます。

その中でサードパーティ、外部サービスと連携できるようになるカスタム 認証・トークンの扱い方は、GitHubにアップしているので参考になれば幸いです。


Storage

AWSだとS3にあたるサービスで、無料でこのクオリティはAWS以上ではないかなと思うくらいリソース管理に最適です。

スクリーンショット 2019-06-17 5.48.12.png

デフォルトで設定されているルールは、Authで認証済みユーザーであれば使用可能というセキュリティ設定ですが、開発中は一旦デフォルトで大丈夫です。どうしても心配になるようでしたら公式のルールについてのガイドを読むと良いでしょう。

スクリーンショット 2019-06-17 6.33.24.png

Storageのスタートガイドで解説されている公開アクセスの設定にて書かれてありますが、とても分かりにくいですよね^^;

しかもAuthの実装が先に完了されていれば、using Firebase;Firebase.Auth.Firebase.Storage.など共通で扱うFirebaseクラスがAuthの情報を持っているため、ルールのセキュリティ設定を気にすることなくStorageの実装ができるように設計されてあります。

スクリーンショット 2019-06-17 16.18.27.png

リソースのアップロードやダウンロードは以下のように実装しますが、特に注目なのがURLでのダウンロード実装が自前で必要になります。要するにFirebase.Storageは、ルールのセキュリティの対応と問題ない場合はアクセスしたリソースのURLを返す実装になってあります(他にもこの中で色々やってそうですが知りたい場合は公式に問い合わせてみると良いかも)。

スクリーンショット 2019-06-17 16.08.10.png スクリーンショット 2019-06-17 16.08.25.png

スクリーンショット 2019-06-17 16.08.33.png スクリーンショット 2019-06-17 16.08.50.png

ですがこの実装で、セキュアなリソース管理ができ、大規模な開発でなければサーバを契約せずとも無料でリソースをFirebaseに管理することができるため、AssetBundleの実装もでき、Unityエンジニアとしては最高じゃないでしょうか笑



こちらもUNIBOOK10の執筆で一部書いた内容でした。

ですが、Unity 2018.2以降からAddressable Asset Systemが登場してきたため、次回はCloud StorageとAddressable Asset Systemでリソース管理に関する執筆または記事作りをやろうかなと考えておりますー!


さいごに

おそらく最初に読んでもらったUnity プロジェクトに Firebase を追加するのステップ2に『Firebase プロジェクトの詳細については、Firebase プロジェクトについて理解するをご覧ください。』と書かれており、初めて触る人にとっては全て理解してすぐに扱えるようになることなんて早々ないと思います。

Firebaseを使い慣れたい方は、すでに誰かがやっていることと同じことを実際にやってみて覚えていくと良いでしょう。

また、FJUG(Firebase Japan User Group)というコミュニティがあるので、FJUGのSlackに入って情報交換などすると良いでしょう。



逆にUnityをもっと扱えるようになるためには、Unityはゲーム・ビジュアルコンテンツ・ツールアプリなど色々作れちゃうので機能がとても豊富です。そのため、日々Unityでもの作りをするととても良いです。

例えば、1WeekGameJamというネット上のイベントや @KzoNagさんが主催しているゆにくえ福岡に参加するなどして経験値を貯めていきましょう!