Unity ARCore開発における実機デバッグことはじめ
はじめに
この記事では、スマホ AR を開発するときに実機デバッグをする方法を紹介します。
私はもともと古いスマホを使っていたせいでしばらくスマホ AR の開発から遠ざかっていたのですが、スマホを買い替えてから再入門しました。
その時に初めて知った便利な機能などがあったため、それらをまとめた記事を書こうと考えました。
ARFoundation を使った開発では有料のアセットを購入したりしないと
エディタ上で高性能なデバッグをするのが難しい現状です。
ちょっとしたアプリを作る分には問題ないですが、
凝った実装をしたり再現性があまりないエラーに立ち向かうときには画面のログ出力だけでは心もとないでしょう。
Unity や IDE が提供している実機デバッグツールを使うと
ある程度ストレスなくトライ&エラーのイテレーションを回すことができます。
TL;DR
スマホ AR の開発では、adb のネットワーク接続や実機デバッグ、
Logcat や Profiler などのツールを使うことで開発体験が向上する。
内容と対象読者
本記事では次の内容を扱います。
- スマホの adb 接続や実機デバッグの方法
- 実機デバッグが捗るツールの紹介
逆に次の内容は扱いません。
- Unity や ARFoundation の基本
- ARFoundation Editor Remote(後述)の使い方
- iOS での動作
本記事で対象としている読者層は以下のような方です。
- Android で AR 開発を始めた人
- スマホ AR 開発で使えるツールが知りたいひと
自分自身もそうなので、割と初学者向けの内容となっています。
何か間違い等ございましたらお気軽にコメントなど頂けると嬉しいです。
想定する環境
- Unity 2020.3.18 LTS
- Rider 2021.2.2
- URP 10.6.0
- ARFoundation 4.1.7
- Windows 10 Home(開発機)
- Pixel 4a 5G(デバッグ機)Android 11
ARFoundation Editor Remoteについて
アセットストアでは「AR Foundation Editor Remote」
というとても便利そうなアセットがありますが、
今回自分が所有していないため本記事では触れません。
(今度買って使ってみたいです)
サンプルプロジェクト
実機デバッグを試せるように、簡単なサンプルプロジェクトを作成しました。
自分のプロジェクトで使う前に 1 回試してみたいという方はぜひ活用してみてください。
平面検知で検出された Plane に Cube を落とすという AR で割とよくあるシンプルなプロジェクトです。
平面検地した床にCubeを落とす様子
準備
ビルドの設定
まずは ARCore 用にビルドの設定をします。
サンプルプロジェクトを使う場合、いくつかの項目はすでに設定済みの可能性があります。
Project Settings から「Player」の項目に移動して次の画像のように設定します。
Color Space の設定は URP 向けのものなので、
従来の Render Pipeline を使用している方は必要ありません。
- Color Space を Linear に
- Graphics API を OpenGL ES に
- Minimum API Level を 26 に
Player Settings
また、XR Plugin Manegement の項目で、
Android のタブにスイッチして ARCore にチェックを入れましょう。
ARCore を有効にする
URP を使う場合、Graphics に移動して URP の Pipeline Asset が設定されていることを確認してください。
Universal RPの設定
これで Project Settings の設定項目は終了です。
Scripting Backend は何も触れていなければ Mono になっているはずです。
IL2CPP に変更しても構いませんが、ビルド時間が Mono のほうが短いので
開発時には Mono にすることをお勧めします。
いったんこのままビルドし、
スマホで動けば実機デバッグの準備ができました。
ネットワーク越しにadb接続
普段どのようにスマホにプロジェクトをビルドしているでしょうか。
スマホを USB ケーブルでつないでビルドするのもよいですが、
AR アプリだとスマホ自体を動かすことがほとんどなので、
実機デバッグのたびに繋ぎなおすのは面倒くさいですよね。
ネットワーク越しにリモートデプロイできれば、毎回 USB で繋ぐ必要がなくなって効率が良くなるのでお勧めです。
リモート接続するためには adb を使います。
adb は Android 開発でかなり便利なので、初めて使うという方は是非今後活用してください。
まずスマホと PC を USB で繋ぎます。
次のコマンドでデバイスが繋がっているかを確認できるので試してみてください。
> adb devices
List of devices attached
xxxxxxxxxxx device
デバイスが接続出来たら、その状態で adb の接続を TCP モードに切り替えます。
> adb tcpip 5555
restarting in TCP mode port: 5555
上のようなメッセージが出てきたら、もうスマホを取り外して大丈夫です。
次にスマホを PC と同一のネットワークに接続したのち、IP アドレスを調べましょう。
自分のスマホだと、設定アプリ→デバイス情報→IP アドレス から確認できました。
IP アドレスがわかったら次のコマンドを実行して、ネットワーク越しにデバイスを adb 接続します。
> adb connect 192.168.11.23:5555
connected to 192.168.11.23:5555
本当に接続できているかadb devices
コマンドで確認してみると以下のようになっていることがわかります。
> adb devices
List of devices attached
192.168.11.23:5555 device
ネットワーク越しに adb 接続ができていれば、
リモートデプロイできるだけではなく後述する Android Logcat も使えるようになるのでお勧めです。
IDEを使ったリモートデバッグ
本記事のメインである実機デバッグをしていきましょう。
ここでは Rider の手順を説明しますが、Visual Studio でも可能です。
まずは適当な場所にブレークポイントを設定します。
例えばサンプルのスクリプトの中で座標計算の結果をインスぺクトしてみましょう。
当然何も設定をしなければ Android で実行したアプリがブレークポイントで止まることはありません(あったら怖いですね)。
ではどうするのかというと、Develpment Build の設定をします。
Build Settings を開き、「Development Build」および「Script Debugging」にチェックを入れます。
Build Settings
Script Debugging にチェックを入れると「Wait For Managed Debugger」が出現しますが、
アプリ起動時にデバッガがアタッチされるのを待機するかどうかのチェックボックスです。
これがあることで起動直後の挙動であってもデバッグできますし、
実機デバッグは手順がちょっと忙しかったりするのですが、
その中で一呼吸置くことができるので個人的にはおすすめの設定です。
ここまでできたら 1 回ビルドしてみましょう。
このときスマホを PC と同一ネットワークに繋いでください
(リモート adb 接続していたら既にそうなっているはずです)。
「Wait For Managed Debugger」にチェックが入っていればアプリ起動時に次のような表示になるのではないでしょうか。
そうしたら OK を押す前に Rider からデバッガをアタッチします。
Rider の画面右上にある Unity のアイコンぽいものを押すと、
「Attatch to Unity Process...」というメニューが出てくるので選択しましょう。
Unity プロセス一覧が表示されるのでスマホで起動しているプロセスを選択しましょう。
するとデバッガが起動するので、スマホで OK ボタンを押してアプリを動作させます。
今回の例だとボタンを押したときのコールバックの中にブレークポイントが仕込まれているのでボタンを押すと画像のようにブレークポイントで止まるはずです。
F10 キーでステップ実行すると計算結果をインスぺクトできます。
無事実機デバッグができました。
補足ですが、IDE を使用した実機デバッグでは
IP アドレスを指定して Unity プロセスを判別するので adb 接続の必要はありません。
便利ツールの紹介
ここからは付録的に、実機デバッグのときに使えるツールを紹介します。
Android Logcatを使ったログ出力
Android Logcat をご紹介します。
このツールはadb logcat
コマンドで実行できる OS のシステムメッセージなどのログ出力を
Unity エディタ上で確認できるものです。
実機で動かしているアプリのログも出力できますし、
デバッグがうまくいかないときに実はシステムからエラーログが出力していた、
なんてことも察知できます。
Android Logcat は Unity 公式のパッケージとして配布されており
Package Manager からインポートできます。
インポートできたら、「Window」→「Analysis」→「Android Logcat」でログを見ることが可能です。
注意点として、このツールは前述のように adb コマンドの実行結果を出力するものなので
デバイスと PC を adb でつないでおく必要があります。
adb 接続ができたら、実際にログが出力されているか確認してみましょう。
Debug.Log
で出力したログが表示されていることがわかります。
他にもいろいろ OS からのメッセージが表示されているので、動作のトレースを詳細に行うことができます。
Unity Profiler
Unity Profiler は使ったことがある方も多いのではないでしょうか。
Unity が公式で開発しているパフォーマンス解析ツールです。
このツールはエディタ再生時に利用できるほか、実機で動いているアプリケーションに対しても使うことができます。
このツールも同一ネットワーク上にあれば、IP アドレスを指定して使えるので adb 接続は不要です。
それでは実際に使って見ましょう。
「Window」→「Analysis」→「Profiler」で Profiler ウィンドウが起動します。
Development Build されたアプリをデバイスで起動し、デバイスの IP アドレスをプロファイラに指定します。
アドレスが間違っていなければ自動でパフォーマンスの解析が始まるはずです。
使うとわかるのですが、
Debug.Log()
で指定したログがコーンソールに出力されています。
Profiler を使うと Android Logcat を使わなくても Debug.Log を見られるので便利です。
おわりに
ARCore の開発で使える実機デバッグというテクニックについてご紹介しました。
今回紹介した内容は ARCore に限らず Android アプリ開発全般で使えるものですが、
特に AR だとデバッグって難しいよね......という観点から書きました。
これらの知見が少しでも皆様のお役に立てれば幸いです。
最後まで読んでいただきありがとうございました。
Discussion