Firebase SDK を Unity Package Manager(UPM) 管理へ移行検証してみた話

f:id:sumzap_engineer_blog:20210511181714p:plain

はじめに

サムザップで Unity エンジニアをしている江畑です。

今回は「戦国炎舞 -KIZNA-」にて、 Firebaseを既存のネイティブ組み込みによる Assets 管理から Unity Package Manager(以下、UPM)管理への移行検証を行った際の話になります。

Crashlytics の動作確認の方法も記載しました。

背景

移行対応はプロジェクト事情によるものでしたが、他プロジェクトでも UPM 管理のコストが安いことは聞いていたのでこのタイミングで UPM 管理にしようというのが経緯です。

前提

移行手順

基本的には Google 公式ドキュメント(Install Google packages for Unity)の通りに進めれば OK です

manifest.json を直接編集する方法と UPM からローカルのパッケージを指定してインストールする方法があります。

どちらでも結果は同じですが、今回は後者の手順でやります。

1. GooglePackages フォルダを作成

  1. Create a new folder next to your project's Packages folder and name it GooglePackages
訳: プロジェクトのPackagesフォルダの隣に新しいフォルダを作成し、名前を「GooglePackages」とします。

以下のコマンドを実行して GooglePackages フォルダを作成します。

$ mkdir GooglePackages

2. 追加したいパッケージ(tgz ファイル)を GooglePackages フォルダに追加

  1. Place the .tgz files into that folder.
訳: そのフォルダに.tgzファイルを入れます。

追加したいパッケージファイルをダウンロードして GooglePackages フォルダに移動します。

パッケージは Download Google Packages for Unity からダウンロード可能です。

GooglePackages フォルダに以下パッケージをダウンロードするコマンド例

GooglePackages フォルダへ移動

$ cd GooglePackages/

External Dependency Manager for Unity をダウンロード

$ curl -O https://dl.google.com/games/registry/unity/com.google.external-dependency-manager/com.google.external-dependency-manager-1.2.165.tgz

Firebase App (Core) v7.2.0 をダウンロード

$ curl -O https://dl.google.com/games/registry/unity/com.google.firebase.app/com.google.firebase.app-7.2.0.tgz

Firebase Crashlytics v7.2.0 をダウンロード

$ curl -O https://dl.google.com/games/registry/unity/com.google.firebase.crashlytics/com.google.firebase.crashlytics-7.2.0.tgz

3. UPM からインストール

Unity を開き、Window > Package Manager を選択して Package Manager ウィンドウを開きます。

+ アイコンをクリックして、Add package from tarball を選択します。

f:id:sumzap_engineer_blog:20210621220850p:plain

インストールするパッケージを選択します。

f:id:sumzap_engineer_blog:20210621220914p:plain

インストールしたいパッケージをすべて選択し終えたら Unity プロジェクトへのパッケージインストールは完了です。

4. コンフリクトを解決する

インストールが完了すると当然ですが Assets 配下で管理していた Firebase SDK とコンフリクトします。

コンソールに大量のエラーログが出ているかと思うので、ログを読みながら解決します。基本的には Assets 管理側のファイルを削除すればエラーは消えます。

5. Android の依存関係を解決する

※ この環境では iOS の対応は不要だったので Android のみ記載します。

Assests > External Dependency Manager > Android Resolver > Resolve を選択すると依存関係の解決が実行されます。

必要に応じて Assests > External Dependency Manager > Android Resolver > Settings から設定を変更してから Resolve を実行します。

ビルドエラーやプロジェクトの事情がない限りは設定不要と思われます。

移行手順はこれで完了です。

Crashlytics の動作確認

本プロジェクトでは Crashlytics の動作確認をする必要があったため、公式ドキュメントを参考に以下 2 つのコードを iOS/Android 端末から呼び出せるようにしました。

// Crashlytics.LogException呼び出し
Crashlytics.LogException(new System.Exception("test exception. Please ignore."));
// 例外スロー
throw new System.Exception("test exception. Please ignore.");

日本語の公式ドキュメントだと Unity のコードが正しく表示されなかったため、英語の公式ドキュメントを参考にしました。

Test your Crashlytics implementation

ドキュメントを読む限り、強制クラッシュを実行する必要はなさそうです。

You don't have to wait for a crash to know that Crashlytics is working. You can force a non-fatal exception to test Crashlytics

訳: Crashlyticsが動作していることを知るために、クラッシュを待つ必要はありません。非致命的な例外を強制的に発生させてCrashlyticsをテストすることができます。

念のため行う場合は以下で確認ができました。

using UnityEngine.Diagnostics;

// 強制クラッシュのカテゴリ
private ForcedCrashCategory _forcedCrashCategory;

// ...中略...

// 強制クラッシュ
Utils.ForceCrash(_forcedCrashCategory);

まとめ

以上で UPM 管理への移行と Crashlytics の動作確認完了になります。

実は本稿の初稿段階では Google が公開していた Game Package Registry を使ったより簡易的な手順紹介だったのですが、2021 年 5 月 19 日をもって提供を終了してしまったため、ローカルにパッケージファイルをダウンロードして UPM 経由でインストールする手順紹介に変更しました。

ローカルにパッケージを展開するデメリットとしてはパッケージファイルサイズが大きいため、Gitでプロジェクトを管理している場合はGit LFSの運用が必要になります。

提供の終了は残念ですが、それでも以前の Assets 管理よりは断然楽になると思います。

以降は Firebase SDK のバージョン変更があっても UPM で簡単に変更できるので、運用コストの削減に繋がるのではないかと思います。

プラグインのバージョンアップ対応は忘れた頃にやってくる上、差し込みタスクになるので先んじて手を打つのが吉です。

プロジェクト毎に環境が異なるため移行途中に発生する問題の解決方法はそれぞれかと思いますが、基本は出力されたログを頼りにググれば先人の方々の解決方法にたどり着けます。

本稿が UPM 管理移行で運用コストの削減を検討されている方の参考になれば幸いです。