こんにちは。もぐめっとです。
最近、お酒を飲みすぎてやらかしたので禁酒してます。
表題の件で、unity2020でfirebaseを使おうとすると、少しトラップがあったので共有しておきます。
概要
unity 2020.2.0a21 という攻めたα環境でandroidでのビルドを行ったところ下記エラーが発生しました
E/Unity: Failed to read Firebase options from the app's resources. Either make sure google-services.json is included in your build or specify options explicitly.
そのエラーに対する探検歴です。
解決法
調べたところマニュアルに対策が書かれていました。
Add Firebase to your Unity project / Missing Firebase Android config file in Unity 2020.
ちなみにマニュアル開くところからトラップなんですけど、↑のページなのですが、言語を日本語から英語にしないと出てきません。
しかも結構日本語で書かれてない他のKnown issuesがワラワラ出てくる。
Unity Package ManagerのインストールがUnityの外部依存関係マネージャー(略してEDM4U、以前はPlay Services ResolverまたはUnity Jar Resolverとかよばれていた)とコンフリクトしてるとか、
Unity 2018でUnity Package Managerを介してインストールするとネイティブ依存関係の一部を検出できないとかとか。。
詳しくは英語で見てくださいっ!
話を戻すと、かのURLに書いてあることは、こんな事が書いてあります。
In order to support versions of Unity that do not have the ability to customize the Gradle build, the Firebase editor tool generates Assets/Plugins/Android/Firebase/res/values/google-services.xml as an Android resource to be packaged into an Android build, so that the Firebase SDK can use it to initialize the default FirebaseApp instance.
In Unity 2020, all Android resources must be in directories with a .androidlib suffix. If your project is using a Firebase SDK that generates an Assets/Plugins/Android/Firebase directory, rename it to Assets/Plugins/Android/Firebase.androidlib. Make sure it contains AndroidManifest.xml, project.properties and res/values/google-services.xml.
つまり、Unity2020からはandroidのリソースをおいてるディレクトリは.androidlibのsuffixついてないとだから、Assets/Plugins/Android/Firebaseにgoogle-services.xmlとか諸々必要ファイルおいてあったら Assets/Plugins/Android/Firebase.androidlib にディレクトリ名変えてくれよな!
ってことらしい。
ディレクトリ名を変えてみたら無事androidのビルドが通ることができました。
恒久対応
この対応ですとなにかのはずみでAssets/Plugins/Android/Firebaseディレクトリが復活したりして二重管理みたいになってました。
そのため、その対応策としてとりあえずシンボリックリンクを張ってどちらでも同じファイルを見るように解決できました。
$ ln -s Assets/Plugins/Android/Firebase Assets/Plugins/Android/Firebase.androidlib
その他の対応方法
公式firebaseアカウントがリツイートしていましたが、こんな方法もあるようです。
Firebase does work with Unity 2020.1, but it requires a little configuration right now. Temporary workaround as a thread.
— 🔥👾Patrick👾🔥 (@pux0r3) July 29, 2020
1/n
First I'd recommend using the Unity Package Manager so you can update when needed. This isn't required.https://t.co/7IVGq8ixLL
— 🔥👾Patrick👾🔥 (@pux0r3) July 29, 2020
2/n pic.twitter.com/fn97Pjrm7q
Next you'll want to use a custom main gradle template and a custom gradle properties template.
— 🔥👾Patrick👾🔥 (@pux0r3) July 29, 2020
3/n pic.twitter.com/K3RpashXnf
Add this block of code to the end of your `mainTemplate.gradle` file:https://t.co/8Ze5ZK5q0g
— 🔥👾Patrick👾🔥 (@pux0r3) July 29, 2020
This is so Firebase can read the google-services.xml file generated by EDM4U from your google-services.json file.
4/n
Now in `https://t.co/zcvL5FxDr1`, add the following two lines to the end:
— 🔥👾Patrick👾🔥 (@pux0r3) July 29, 2020
```
android.useAndroidX=true
android.enableJetifier=true
```
This is added to `mainTemplate.gradle` by EDM4U, but the way that happens doesn't work with Unity 2020.1
5/n
Finally: restart Unity. Unity 2020.1 doesn't pick up on these changes and the project in your `Temp/` directory will still be in a bad state.
— 🔥👾Patrick👾🔥 (@pux0r3) July 29, 2020
Now you should be able to Build and Run in Unity. Again, this is a temporary workaround.
6/n, n=6
同じ方法はこのissueでも上がってました。
ただ、結局マニュアルに書いてある方法で解決できたためこちらの方法は試してはいないです。
@mogmetの所感
unity2020自体がまだ出たてで少し発展途上なところがあるので使う方は人柱覚悟で行く必要がありそうです。
ただ、unity2020.2からはC#8になって、目玉機能であるnull許容参照型が使えるようになるので早くまともに使えるようになってほしいですね。