ビリヤードゲーム制作 プロジェクト最後で踏んだバグと対処 - アプリ名「Ferret's pool billiards」

こんにちは!

インディゲームを制作するディベロッパー「Studio Itachi」のZiggyです。
去年末にカジュアルビリヤードゲーム Ferre's pool billiards をリリースしました。

ゲーム制作練習で作ったので内容の反省は後程やるとして、今回はプロジェクト後半で踏んだわけのわからんバグの対処を記していきます。
対処せずに回避したという言い方が正しいものが多いです。

Admobでビルドは通るけど表示が出ない

【症状】
Admobのバナーを実装し、ビルドも問題なく通ってapkファイルを作成したが、画面下部に表示されるはずのバナー広告が出ない。

【解決策】
①アプリIDを修正。
(メニューバーの)アセット > Google Mobile Ads > Settings...
の Google Mobile Ads App ID の部分で、操作ミスで冒頭の「ca-app-pub-」が「p-pub-」になってた。
ここの記載をミスってもビルドエラー出ないので要注意。

②R8のチェックを外した。
(メニューバーの)ファイル > ビルド設定 を開き、
プラットフォーム「Android」のプレイヤー設定を開く。
公開設定 > ファイル圧縮 > R8を使用 のチェックを外した。

こうすると、PlayConsole上では警告が出るが、apkファイル、aabファイルともにちゃんと広告が出るようになった。
難読化対応もしたいので、本来なら対応なきゃいけないんだろうと思いますが、対処できなかったので回避するほうを選びました。

メッシュコライダーがエディタ上ではあるものの、ビルド後は消えてしまう。

【症状】
3Dモデルの床の当たり判定にメッシュコライダーを使っていた。
Unityのエディタ上ではメッシュコライダーが機能しているものの、apkファイルにビルド後はメッシュコライダーが存在しないような挙動になってしまう。
つまり、ビルドすると当たり判定がなくなるので床が抜けている状態になった。
ビルドエラーもでていない。

【対処】
3Dモデルのインポート設定にある「読み込み/書き込み」にチェックをつけて再ビルド。

基本的なことですが、この問題はLogcatでちゃんとエラーが出ていました。
そのエラー文はなくしたので貼れませんが、apkビルド後もLogcatで挙動を追ってれば解決策が見えるものが多いです。

■Google Play Game Service

【症状】
Unity 2022.1.16f1 + Google Play Games Plugin for Unity 0.11.01 にて発生。
Unityのエディタ上では PlayGamesPlatform.Activate(); で正常にFailedするが、apkにビルド後はActivate()に入った後抜け出せなくなる。
そのため、アクティベートのFailedの処理もできないし、もちろんログイン処理までたどり着けない。

【対処】
(メニューバーの)アセット > External Dependency Manager > Android Resolver > Force Resolve を実行した。

正確には11.01のままでは実装方法を修正したりGPGSのプラグインをインポートし直したりしてもアクティベートは完了しませんでした。この時はForce Resolveはしていません。
この状態から10.14をインポートしました。11.01と10.14が共存している状態なので当然エラー出まくりです。
このまま対処してもログインにたどり着ける気がしなかったので、11.01を再インポートし、ここでForce Resolveを行いました。
すると、11.01と10.14が共存している影響でResolve failedになるので、エラー内容に従って10.14の環境を11.01に変更する修正をかけていきました。
エラーが取れてForce ResolveがSuccessすると、アクティベートが通りログインできるようになりました。

発生していたエラーもわからない上になんで直ったのかも不明です。

ちなみに、、、

よくハマる罠として、認証情報のOAuth 2.0に登録するSHA-1の値があります。
PlayConsoleへのアップロード前はコマンドプロンプトでkeytoolのコマンドを使って出せばいいですが、アップロード後はこれだとログインできないです。
aabファイルをPlayConsoleへアップロードした後はPlayConsoleのプロジェクトのページを開き、左側に出ているメニューの リリース > 設定 > アプリの完全性 とたどって、アプリの署名 を確認します。

ここにアプリ署名鍵の証明書とアップロード鍵の証明書が出てきますので、
アプリ署名鍵の証明書のほうのSHA-1を使用するとログインできると思います。

PlayConsoleへのアップロードで高頻度でクラッシュが発生。しかも不定。

【症状】
ビルドエラーは出ないが、aabファイルをPlayConsoleへアップロードすると、以下のようなクラッシュのスタックトレースが不定で出てくる。

java.lang.RuntimeException: Unable to start receiver com.google.android.finsky.instantapps.PhenotypeUpdateReceiver: java.lang.IllegalStateException: Not allowed to start service Intent { act=com.google.android.gms.phenotype.UPDATE cmp=com.android.vending/com.google.android.finsky.instantapps.PhenotypeUpdateService }: app is in background uid UidRecord{eeb68ec u0a192 TRNB bg:+5m57s837ms idle change:uncached procs:4 seq(0,0,0)}

android.app.RemoteServiceException$CannotDeliverBroadcastException: can't deliver broadcast

ANR in com.google.android.apps.messaging;PID: 15362;Broadcast of Intent { act=android.accounts.LOGIN_ACCOUNTS_CHANGED flg=0x5000010 cmp=com.google.android.apps.messaging/com.google.apps.tiktok.account.data.device.DeviceAccountsChangedReceiver_Receiver };

【対処】
ビルドするたびにUnityを再起動する。

これは何が起きているかもなんで大丈夫なのかも全く分からないのです。
PlayConsoleへアップロードしたときにクラッシュが発生しないケースもあたので、その時の手順を思い返したところ、Unityを起動して最初のビルドでは問題が出ないということが分かりました。
どういうことなんでしょうかね…。

■最後に

特にGPGSでログインできないのは参っていて、使用をやめるつもりでした。
が、別件のバグの対応でたまたまForce Resolveしたらログインできちゃったという感じでした。
外部プラグインで詰まったらForceResolveですね!

あと最後の謎のクラッシュね…。大方メモリ不足で何か失敗してるんだろうなと踏んでますが、ビルドエラー出ないのでわかりません。

もし記事が面白いなぁと思いましたら、Twitterのほうをフォローしていただけると嬉しいです!
日々のゲーム制作の進捗や、ブログの更新告知、たまにふと思ったことなんかを呟いていますのでよろしくお願いします。