※ これは 2022/12/23 時点の Unity 2022.2.1f1, Firebase Unity SDK v10.3.0 の情報です
最新版では動作が異なる可能性がありますのでご注意ください
リリースされた Unity 2022.2 の TECH ストリーム、さっそく触ってみようと Firebase Unity SDK をインポートした Android アプリをビルドしてみる
スポンサードリンク
Firebase Unity SDK の導入手順にしたがい、パッケージをインポートして、google-services.json
もダウンロードして配置
Player Settings
の Publishing Settings
の中の Custom Main Gradle Template
と Custom Gradle Properties Template
にチェックを入れ、Assets/Plugins/Android/gradleTemplate.properties
も下記のように書き換えた
org.gradle.jvmargs=-Xmx**JVM_HEAP_SIZE**M org.gradle.parallel=true unityStreamingAssets=**STREAMING_ASSETS** **ADDITIONAL_PROPERTIES** android.useAndroidX=true android.enableJetifier=true
Unity の不具合でおかしくなる Assets/GeneratedLocalRepo/Firebase/m2repository
配下の各種ライブラリのバージョン番号ディレクトリも正しく 10.3.0
に修正した
[Assets]
- [External Dependency Manager]
- [Android Resolver]
- [Force Resolve]
で参照ライブラリのインポート設定を追加して、準備万端とばかりに Android ビルドを実行すると・・・
ビルド失敗!!なんでじゃっとコンソールログを見てみると・・・
Firebase SDK の ローカルリポジトリにあるライブラリが参照できなくて Gradle ビルドに失敗している!
・・・どうやら Unity 2022.2 からビルドに使用する Gradle のバージョンが変わり、出力される Gradle プロジェクトの構造が変わって Firebase SDK と不整合が起きるようになったらしい
仕方がないのでビルド問題を解決すべく追加手順を実施
まず Unity のインストール先ディレクトリの Editor/Data/PlaybackEngines/AndroidPlayer/Tools/GradleTemplates/settingsTemplate.gradle
を Assets/Plugins/Android
にコピーする
コピーした settingsTemplate.gradle
を下記のように書き換え
pluginManagement { repositories { **ARTIFACTORYREPOSITORY** gradlePluginPortal() google() mavenCentral() } } include ':launcher', ':unityLibrary' **INCLUDES** dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS) repositories { **ARTIFACTORYREPOSITORY** maven { ${MAVEN_REPOSITORIES} } google() mavenCentral() flatDir { dirs "${project(':unityLibrary').projectDir}/libs" } } }
次に IPostGenerateGradleAndroidProject
を利用して Gradle プロジェクト出力直後に実行されるスクリプトを追加する
Assets/Editor/PostGenerateGradleAndroidProject.cs
というファイルを作成し、下記のように記述
#if UNITY_ANDROID && UNITY_EDITOR using System.IO; using System.Text; using UnityEditor.Android; using UnityEngine; public class PostGenerateGradleAndroidProject : IPostGenerateGradleAndroidProject { /// <summary> /// 処理優先度 /// </summary> public int callbackOrder => 0; /// <summary> /// Gradle プロジェクト生成時に呼び出される処理 /// </summary> /// <param name="path">Gradle 用 unityLibrary プロジェクトの出力先パス</param> public void OnPostGenerateGradleAndroidProject(string path) { // Gradle プロジェクトのルートパスを取得 var rootProjectPath = path.TrimEnd('/').Replace("unityLibrary", ""); // settings.gradle のパスを取得 var filePath = Path.Combine(rootProjectPath, "settings.gradle"); // External Dependency Manager のローカルリポジトリを参照先に追加 var info = new DirectoryInfo(Path.Combine(Application.dataPath, "GeneratedLocalRepo")); var repositories = new StringBuilder(); var directories = info.GetDirectories(); for (var i = 0; i < directories.Length; i++) { if (i > 0) { repositories.AppendLine(); } var fullPath = directories[i].FullName.Replace('\\', '/'); repositories.Append($" url 'file:///{fullPath}/m2repository'"); } // settings.gradle を書き換える var settings = File.ReadAllText(filePath); settings = settings.Replace("${MAVEN_REPOSITORIES}", repositories.ToString()); File.WriteAllText(filePath, settings); } } #endif
Unity 2022.2 以降だと settings.gradle
内に指定したリポジトリからしかライブラリを参照しなくなる RepositoriesMode.PREFER_SETTINGS
が指定されてしまうので、settings.gradle
を書き換えて Firebase SDK のローカルリポジトリも参照するようにする設定を追記するという感じ
Firebase SDK(External Dependency Manager) は mainTemplate.gradle
の方にローカルリポジトリを参照するコードを自動追記するんだけど、これが全無視されるのでビルドに失敗してしまうというわけ
ともかくこれで再度 Android ビルドすると・・・
今度は無事成功!
Unity の対応はいつもとても遅いので、できれば External Dependency Manager の速やかな対応を期待したい・・・