🤝

UnityとFirebaseで出来ること2022

2022/05/22に公開

Outline

Unityを使っている方向けにMBaaSのFirebaseを組み合わせて、どんなことができるか簡単に紹介する記事(+筆者の備忘録)です。なお、記載事項は2022年5月下旬時点の情報となります。

環境

当記事は、次の環境上で動作確認をしています。

  • macOS Monterey 12.3
  • Unity ver2021.3.2f1

Unityのネットワーク実装における選択肢

Unityはゲームをはじめとしたクロスプラットフォームアプリケーションの開発を行うことが可能なパワフルな開発環境です。ゲームは、グラフィックやサウンドなどの実に様々な要素から構成されているアプリケーションで、実現したいユーザー体験や開発者事情に合わせてそれぞれの要素の持つ技術的選択肢を上手に組み合わせて開発を行います。

ネットワークもまた、そんな多様な選択肢を持つ要素の一つです。ここでは、細かい分類わけは考えずに選択肢として名前の上がるアセット、フレームワーク、サービスなどを羅列してみます。

当記事ではこういったネットワーク実装の1手段として、"Firebase"と呼ばれるサービスをご紹介します。

Firebaseとは

FirebaseはGoogleの提供するアプリ、ゲーム、Webサービスをはじめとした"モバイル開発"を支援するサービスです。ここ近年は対応範囲を広げており、"モバイル開発"の領域を超えた利用も一部可能です。

Firebaseのコンセプト

"モバイル開発"に興味のある人、携わった人であれば、次にあげる様々な"開発者、運営者の悩みの種"となる要素について見聞き、体験したことと思います。

  • ソフトウェア・ハードウェア的な"準備の手間"
  • 開発終盤〜リリース後に起こる"トラブル"
  • "マネタイズ"や"ユーザーの継続率維持"

Firebaseでは、これらの"開発者、運営者の悩みの種"を上手に解決するためにGoogleが有する強力な技術、知見そして洗練されたデザインによって整えられた様々な製品によって構成されており、「面倒な部分は我々Googleが支援します。あなたは"あなたの作品の軸となる部分"に注力してくださいね。」というコンセプトの元に開発・運営がなされています。

以後、Firebase内部の製品群を便宜上"プロダクト"と呼び説明を進めます。

プロダクト

Firebaseの内部は大きく次の3分野に分かれます。

  • Build:構築。開発を促進するためのプロダクト群。
  • Release&Monitor:リリースとモニタリング。リリース前後に役立つプロダクト群。
  • Engage:エンゲージメント。ユーザーエンゲージメントに関するプロダクト群。

これらのことからわかるように、Firebaseは開発時だけに利用するサービスではなく、リリース、リリース後の運用の場面まで役に立つ機能も含めたサービスとなっており、上手に使いこなすことが出来れば効率的かつ手軽に"モバイル開発"を進めることが可能となるサービスです。

Firebase導入の留意点

動作環境

UnityサイドからみたFirebaseに対して留意すべきことの筆頭として、Firebaseのサポート対象となっているのはAndroidアプリ開発とiOSアプリ開発の2点のみであることが挙げられます。Unityはクロスプラットフォームなゲーム開発をできる点が魅力ではありますが、そこに目をつぶってでも採用する価値が見出せる場合での利用を推奨します。(実際、その価値はあると筆者は考えています。)

FirebaseサイドからみたUnityに対して留意すべきことは、Firebaseの提供しているプロダクトは全てのプラットフォームに対して開かれているものではないということです。一部のプラットフォームに利用が限定されているプロダクト(例:Android,iOSアプリのみ。Webサービスのみ...etc)も存在するため、「このプロダクト、○○(例:Unity)で使えるかな?」と事前に下調べをすることをお勧めします。興味のある方は公式サイトのドキュメントやYoutubeにアップされている公式動画などをご覧ください。

当記事では、Firebaseサイドから"Unityに対応している"と明言されているプロダクトを中心にご紹介します。

金額

Firebaseは"基本無料"で始めることが出来ますが、本格的に使いたい場合は従量課金のプランに切り替えることになります。(実際のところ、プロダクト毎に異なる料金体系を持ち、支払いは1ヶ月毎に全プロダクト利用料の合算値が請求されます。)

従量課金プランの場合であっても、プロダクト毎に"毎月の無料枠"が設定されているものもあるため、利用方法によっては0円に抑えた使い方も可能です。とはいえ、使っただけ課金される構造は柔軟性の高い一方、間違った使い方によって高額な請求も発生する点は覚えておくと良いでしょう。かつて、間違った利用方法によって課金額が膨れ上がり、炎上したプロジェクトも存在します。(これは、Firebaseに限った話ではありません。クラウドサービスの利用は"しっかりとした設計"が大事です。)

当記事では、紹介するプロダクト毎の料金体型についてまでは取り上げません。

UnityへのFirebase導入手順

UnityとFirebaseを連携させて使うためには、事前にいくつかのステップを踏む必要があります。

Firebaseへの登録とFirebaseプロジェクトの作成

Firebase公式サイトにアクセスし、Webページ右上からサインアップしましょう。Googleのアカウントを保有していると簡単です。(画像ではサインアップが済んでいる状態で、"コンソールに移動する"表記に変わっています。)

続けて、作成中のゲーム(もしくはこれから作るゲーム)に紐付けするFirebaseプロジェクトを作成します。プロジェクト名が必要である点以外は、手順にさほど難しい内容はありません。(迷った場合はデフォルトの状態で問題ありません。)

なお、プロジェクト作成時点ではどのプロダクトを使用するか全く決まっていなくても問題ありません。

Firebaseコンソール

プロジェクトの作成後は、"コンソール"と呼ばれるWebページからプロダクトの導入や様々な設定変更を行います。

左側からは各プロダクト毎のページを確認することができます。迷ったら左上の家アイコン「プロジェクトの概要」をクリックすれば上記スクリーンショットのホーム画面に戻ることが可能です。

UnityプロジェクトとFirebaseプロジェクトの接続

ここからは、少々の手間が入ります。

まずはFirebaseコンソールのホーム画面に見える、Unityアイコンをクリックします。

「Unity アプリへの Firebase の追加」の画面に変わりますので、AndroidかiOS(必要によっては双方)のチェックを入れた後、必要事項を入力します。当記事では、一旦Androidアプリを作る程で設定作業を進めます。(iOSアプリの設定は後ほどこの画面に戻って追加で実施することが可能です。)

必要事項の入力

次の2情報を入力します。

  • Androidパッケージ名
  • アプリのニックネーム

Androidパッケージ名の欄には、UnityEditorから以下の情報を探し出して転記します。

  • Build Settings > Android > Player Settings > Other Settings > Identification > Package Name

Package Nameは、デフォルトでcom.カンパニーネーム.プロダクトネームになっています(カンパニーネームとプロダクトネームは、Build Settings > Android > Player Settings の一番上に入力欄があります)。

筆者は、Unity上での設定を調整したうえで、以下のような内容を最終的に入力してみました。(個人的な事情から、Package Nameをデフォルトのものから別のものへ変更しています。)

設定ファイルのダウンロード

続けて、表示の通りにFirebaseの提示されたpackage.jsonファイルをダウンロードし、Assetsフォルダ上に保存します。

Firebase SDKの追加

続けて、表示の通りにSDKをダウンロードし、Unityへ取り込みます。(なお、ダウンロードデータは1.67GBあります。結構ヘビー。)

ダウンロード後のデータの中身は、dotnet4とdotnet3というフォルダの2つに大きく分かれていますが、Unityのバージョンが2019以降であればdotnet4の中にある.packageファイルをインポートします。

なおdotnet4フォルダの中には、この後紹介するFirebaseのプロダクト毎に個別の.unitypackageが用意されています。Firebaseのプロダクトと.unitypackageファイルの対応状況は以下の通りです。

Firebaseプロダクト名 .unitypackageファイル名
Google Analytics For Firebase FirebaseAnalytics
Firebase Authentication FirebaseAuth
Firebase Crashlytics FirebaseCrashlytics
Firebase Realtime Database FirebaseDatabase
Firebase Dynamic Links FirebaseDynamicLinks
Cloud Firestore for Firebase FirebaseFirestore
Cloud Functions for Firebase FirebaseFunctions
Managed Firebase Installations FirebaseInstallations
Firebase Cloud Messaging FirebaseNessaging
Firebase Remote Config FurebaseRemoteConfig
Cloud Storage for Firebase FirebaseStorage

FirebaseコンソールだけでなくGoogle APIs for UnityからもPackageファイルはダウンロードが可能です。(ただし、バージョンを揃える必要がありますのでご注意ください。)

上記のパッケージの中から実際は必要なものだけインポートする形で問題ありません(それぞれのパッケージの中身には被りデータも多く存在します)。ちなみに全て順番にインポートを行うと結構時間がかかりました。

途中、次の表示が出ることがあります。


これは、近年よくみる「ソフトウェア改善のために利用状況(トラブルが発生したときの内部情報etc)をソフトウェア開発元に送信して良いですか?」という確認です。送信が嫌であればNoを、問題ない場合はYesをクリックします。

途中、次の表示が出ることがあります。

これは、自動でAndroidアプリ開発に関係するパッケージの依存関係を解決する機能を有効にするかどうかの確認です。Enableにすると、以後のインポート時などにネット上から最新版がないかどうかやインポートによるバージョンの前後関係や関係の崩壊が起こらないかどうかのチェックを行います。無効にすると、自身でパッケージ間の依存関係を解決しなければいけなくなり、少々面倒です。ただ、依存関係解決は時間のかかる処理ですので、一旦無効にして、後で有効にすることなどでも対応可能です。

必要なパッケージの取り込みが全て終了すれば、準備完了です。UnityEditor上では、Assets > Plugins > Android 以下に多種多様なファイルがインポートされたことが確認できます。

次のステップ

ここからは、Firebaseの有するプロダクトを具体的に利用するステップに入っていきます。

例えば、プロダクトのひとつであるFirebase Realtime Databaseの利用設定を施した後には、ゲーム内のデータをFirebase Realtime Databaseで管理するデータと簡単に連動させることが可能になります。

補足

今後紹介するプロダクトを導入し、手元の環境(Mac)でデバッグを行った際、以下の表示が出る場合があります。

こういった場合は、アップルメニュー >「システム環境設定」と選択して、「セキュリティとプライバシー」 をクリックし、「一般」をクリックした後の画面に表示される内容を確認します。

上記の画面の下部に以下のようなメッセージとボタンが表示されますので、「このまま許可」をクリックすれば問題ありません。

Unityで使えるFirebaseプロダクト

ここからは、Unityで利用可能なFirebaseプロダクトを簡単な利用例とともに紹介します。細かい仕様や具体的な使用方法(Firebaseコンソールの操作、スクリプト)については、今後それぞれのプロダクト毎に記事を書く予定ですのでそちらをご参照ください。

Firebase Authentication

Firebase Authenticationはあなたのゲームのユーザーを認証し、管理する機能が簡単に実現できるプロダクトです。略して、AuthやAuthenticationなどとも呼ばれます。

認証の面に関しては、あらかじめFirebase側で用意されたメール、電話などの認証方法をはじめ、TwitterやLINEなどのGoogle社外のIDプロバイダ(ユーザーが既に持っているアカウントなどを利用してあなたのゲームにログインする機能)にも対応可能です。

管理の面では、認証の済んだユーザーをFirebaseコンソールから一覧し、編集すること可能です。

認証されたユーザーの情報は、他のプロダクトからも参照でき、認証されたユーザーのみに特定の機能を提供することなどが可能です。

Cloud Firestore for Firebase

Googleの保有するネットワーク上にnoSQL型(=RDB型でない)データベースを借りる事が出来るプロダクトです。略して、Firestoreなどとも呼ばれます。

データベース上のデータは"フォルダとファイル"のような関係性で保存され、専用のSDKを利用することで開発者のあなただけでなく、各ユーザーのゲーム本体からデータ送受信を行って読み書きも可能です。このデータは、適切なセキュリティ設定を施せば他のユーザーと自由に共有することも可能です。

Cloud Firestore for Firebaseを利用したデータの送受信には、他に類を見ない以下の機能が自動でついてきます。

  • データの変化がリアルタイムに近い形でそれを利用するユーザー全てに自動で反映される
  • ゲーム本体が一時的にオフラインでも、オンラインに戻り次第自動で同期を再開する
  • 最大保存容量や同時利用ユーザーがどれだけ増えても安定的に動作するように自動で拡張される(限度あり)

Firebase Realtime Database

Googleの保有するネットワーク上にnoSQL型(=RDB型でない)データベースを借りる事が出来るプロダクトです。前述のCloud Firestore for Firebaseと似たプロダクトですが、Firebase Realtime Databaseは特に読み書き速度に秀でた性能をしています。

リアルタイムで複数のユーザーがプレイ体験を共有するゲームなどでは読み書き速度に秀でているFirebase Realtime Databaseの方がニーズに合うかもしれません。

Cloud Storage for Firebase

Googleの保有するネットワーク上に画像や音声をはじめとした静的なデータを保管するストレージ(格納スペース)を提供してもらえるプロダクトです。略して、Cloud Storageなどと呼ばれます。

写真をはじめとしたユーザー生成コンテンツをゲーム本体からアップロードして他のユーザーと共有したり、アップデート用の静的なデータを格納し、配信に利用したりなどが可能です。

Cloud Functions for Firebase

Googleの保有するネットワーク上に自作のファンクション(関数)を登録し、好きなタイミングでどこからでも呼び出すことのできる様になるというプロダクトです。略して、Cloud Functionsとも呼ばれます。

このプロダクトは次のようなケースで有用です。

  • 悪意あるユーザーに端末上のアプリを解析されたときに見られると困るデータや処理がある
  • 特定の日付や時間になったら呼び出したい処理がある
  • Firebase上の特定の変化を検知して行いたい処理がある

Cloud Functions for Firabaseは単独での利用も可能ですが、他のプロダクトと連携して利用することで真の力を発揮します。

Firebase Crashlytics

Crashの名を冠する通り、ゲームがクラッシュした時の情報をあなたのFirebaseプロジェクトに自動転送するクラッシュ解析プロダクトです。

自動転送された情報は、発生日時やクラッシュ状況によって整理・分析され、Firebaseコンソール上に綺麗に表示され、フィルタリングや絞り込みを行うことが可能となります。

特にAndroidアプリなどでは端末のバリエーションが豊富なため、端末固有のクラッシュ現象に悩まされるといったことが起こり得ます。Firebase Crashlyticsを導入し、クラッシュ状況をいつでもモニタリングできるようになることで、次のような効果が期待できます。

  • 優先順位を付けた計画的なバグ修正
  • 致命的な問題点の早期発見

Google Analytics For Firebase

アプリの利用状況を自動で収集し、Firebaseプロジェクト上に自動転送を行うプロダクトです。略して、Google AnalyticsやAnalyticsとも呼ばれます。

このプロダクトの強みは、Analyticsの名を冠する通り、収集した情報の解析・分析にあります。(これだけのためにFirebaseをUnityと連携させたという話も耳にするほど有名かつ強力なプロダクトです。)

  • アクティブユーザーの人数
  • ユーザーの国別利用者数
  • 各ユーザーのプレイ継続日数

などをはじめとした重要な情報をFirebaseコンソール上にわかりやすく表示してくれます。また、開発者が独自にカスタムイベントを作成してアプリ内部に仕込むこともでき、

  • どこのステージでユーザーが詰まっているか
  • ユーザーがゲーム内で特定の行為(実績など)をどれだけ実施したか
  • 課金状況の計測、売れ筋商品の理解

などにも利用することが可能です。

Firebase Remote Config

アプリに仕込んだデータを遠隔から変更可能とするプロダクトです。略して、Remote Configとも呼ばれます。

”遠隔から変更可能”と言っても、何でもかんでも遠隔で変更可能にすれば良いものではなく、このプロダクトの目的は、あくまでゲーム上の"振る舞い"を変更することによる"より多くのユーザーの継続率や満足度を上げる"ことです。例えば、季節や祝日に合わせて配色を変更するためにこのプロダクトを使えば、ゲームへより親しみを持ってもらえるように役立てることができます。

このプロダクトが持つ"フィルタリング機能"を合わせて使う事で、"振る舞い"を地域別、端末種別などに対してのみ変更する事も可能です。なお、個人別にピンポイントで"振る舞い"を変更することはできません。

Firebase Cloud Messaging

ユーザーに通知を出すことが簡単にできるようになるプロダクトです。略して、Cloud MessagingやMessagingとも呼ばれます。

"通知"とは、モバイル端末であればノーティフィケーションと呼ばれるものが有名ですが、電子メールなどでも出すことが可能です。

ダイナミックリンクが生成可能になるプロダクトです。

ダイナミックリンクは一般的なWebのリンクと異なり、ユーザーの操作端末や環境を踏まえて挙動を変えるリンクです。例えば、ゲームへのダイナミックリンクを発行すると、そのゲームをインストール済のユーザーはゲームが起動し、インストールをしていないユーザーはアプリストアに誘導されるような挙動をとります。

このプロダクトでは、ダイナミックリンクを生成するだけでなく、その管理もできます。例えば、ダイナミックリンクを経由してゲームをインストールしてくれたユーザーに特典を与えるといった使い方をすることも可能です。

その他

このほかにも、利用可能なプロダクトやプロダクト・・・という規模ではないものの、機能的なものも多数存在します。将来的には、利用可能なプロダクトも増えるかもしれません。

プロダクトを組み合わせる

ここまでプロダクトを個別に紹介してきましたが、プロダクトは連携させることで高い相乗効果を得ることができ、例として次のような使い方が可能です。(表示幅の関係で略称表記をしています)

組み合わせ例 利用ケース
Authentication
Firestore
特定のユーザーのみに限定して公開する情報を制御する 他
Firestore
Functions
Cloud Firestore上に記録されている特定のデータに発生した変化(イベント)をトリガーにして、関数を実行する 他
Storage
Functions
Cloud Storageに画像がアップロードされたことをトリガーに、解像度違いのバリエーション画像を生成する関数を実行する 他
Analytics
Messaging
しばらくゲームへログインしていないユーザーに対してだけログインを促す通知を出す 他

プラットフォームを組み合わせる

上記で紹介しなかったプロダクトは基本的にUnityでは利用できない・・・、と思われがちですが、実はちょっとした工夫をすれば間接的に利用を行うことが可能です。

  • WebサイトやWebサービスをホストするFirebase Hostingプロダクトにて、Cloud Firestore for Firebaseプロダクト上に連動させているの自作のゲームの進行状況や全プレイヤー共通のランキングのデータを入手して表示させる

また、Firebaseプロジェクトは、"ひとつのゲームにつき、必ずひとつで管理する"と、いう形で縛られていません。このため、次のような事も可能です。(とはいえ、この手法が正解でないケースも十分考えられますので作成する前の検討は必要です)

  • 同じ世界観などを共有する兄弟作のゲームを作る際に、進行度やプレイ状況を共有する
  • 続編を作るときに、前作データの転用やコンバージョンを行う

まとめ

UnityとFirebaseで出来ることは非常に多く、各プロダクトを深掘りしていくことや複数のプロダクトを効果的に組み合わせることでとてもパワフルなアプリ開発も可能です。Firebaseは現在もGoogleによって継続的にメンテナンスされており、機能向上や新機能の追加なども積極的に行われています。

この記事によって皆様が、"UnityとFirebaseで出来ること"に大きな魅力を感じて導入にまで踏み切って頂ければ幸いです。

今後は、個別のプロダクトを利用した例を紹介できればと思っています。それではまた。

Discussion