マツダ車のAndroid Auto機能でナビ画面にUnityを映したかったが数々の壁に阻まれた件
この記事はAkatsuki Games Advent Calendar 2022 18日目の記事です。
昨日はYuji Sugiyamaさんの画像から音楽を生成する「img2music」を手探ってみるでした。 最近はStable Diffusion等の登場によりAIでの画像生成や自然言語生成の成長が目覚ましいですが、音楽生成についても数年前からだいぶ進んでいるんですね〜。 AIの活用に関する動向が気になる方におすすめの記事です!
他にもアカツキゲームスの皆さんによる色々な記事がある(ゲーム会社ですがまるでゲーム以外の技術もかなり多いですよ)のでどうぞ!
はじめに
本記事の内容を3行にまとめると
- Android Autoという機能により、スマホにインストールしたAndroid Auto用アプリを車のナビ画面上に表示できる
- Android Auto用アプリは数あれど、Unityを使ってみた例が見当たらなかったので作ってみたかった
- しかし2つの大きな壁にぶち当たって挫折した
です。
目次
- はじめに
- 背景
- 実験環境
- サンプルのAndroid Auto用アプリをビルドしてみる
- サンプルのAndroid Auto用アプリをスマホで動かしてエミュレータで表示してみる
- 【立ちはだかる壁1】サンプルのAndroid Auto用アプリをスマホで動かしてマツコネで表示してみたかったができなかった(悲)
- 【立ちはだかる壁2】せめてDHU上だけでもいいからUnityの画面を表示したかったがスマホ側の画面にしか出せなかった(悲)
- 今後の展望
- おわりに
背景
最近車を買いました。
my new gear... pic.twitter.com/2grXs2TOwU
— ろうでん (@cllightz) 2022年7月3日
で、この車(マツダ車)にはマツコネ(マツダコネクトの略)というAndroid Auto対応の多機能なナビ(?)が搭載されています1。
せっかくなのでAndroid Autoアプリを自分で作ってみたいなと思い立ちました。
Android Autoというのは、(誤解を恐れずに言えば)Android搭載スマホ上で動作するアプリの画面を車の画面に表示して操作できるようにする技術の一つです2。
マツコネを含むAndroid Auto対応ナビはあくまでもインタフェースとして動作するだけで、Android Auto用アプリはあくまでも接続されたスマホ上で動作します。
Unityを用いたゲーム開発で飯を食ってる身なのでUnityでAndroid Auto用アプリを作れないかネット上で軽く調べてみたところ、Unity Forumに「作れなかった(細かい情報はナシ)」という古〜いスレッドが2つ見つかった (1, 2 だけだったので、やりようがあるのではないかと思い、トライしてみました(そして前人と同じ末路を辿りました)。
実験環境
車
- 車種: マツダ・ロードスターRF
- グレード: VS Terracotta Selection
- 年式: 2022年式
- 形式: 5BA-NDERC
- OS: 74.00.310 JP M
- マツコネ: v1
Windowsでの実験環境 (環境1)
- 開発用PC
- OS: Windows 10 Pro (10.0.19045)
- Unity: 2021.3.16f1
- Android Studio: Dolphin 2021.3.1 Patch 1
- DHU: 2.0-windows
- スマホ
Macでの実験環境 (環境2)
- 開発用PC
- 機種: MacBook Pro (14-inch, 2021)
- OS: macOS Monterey 12.6.2
- Android Studio: Dolphin 2021.3.1 Patch 1
- DHU: 2.0-mac-arm64
- スマホ
サンプルのAndroid Auto用アプリをビルドしてみる
Android Auto用アプリのサンプルプロジェクトがGoogleによって複数公開されており、少なくともAndroid for Cars App Library samples・Universal Android Music Player sample・Media Controller Test sampleというものがありました。
今回はこの1つ目のAndroid for Cars App Library samplesを題材にします。
- GitHubから公式サンプルのリポジトリをclone
car_app_library
フォルダをAndroid Studioで開く- 【トラップ1】
helloworld
のautomotive
・common
・mobile
のそれぞれに対応するbuild.gradle内のdependenciesのimplementationにあるapp-automotive
・app
・app-projected
のバージョン1.2.0-rc01
を1.3.0-alpha01
に変更する(参考)- これをやらないとビルドできませんでした
- それぞれのproject (helloworld, navigation, places, showcase) をビルド
サンプルのAndroid Auto用アプリをスマホで動かしてエミュレータで表示してみる
Android DeveloperのAndroid Auto 用のアプリをテストするを参考にしました。
ありがたいことに、Googleが提供するDHU(Desktop Head Unit)というツールを使うことでPC上でAndroid Auto対応ナビをエミュレートでき、スマホ上で動作するAndroid Auto用アプリをテストすることができます。
試していませんが、実機のスマホだけでなくAndroid Emulatorでもテストできるはずです。
- DHU バージョン 2.0 をインストールするを参考にしてインストール
- スマホをPCに接続3
- DHU を実行するを参考にして実行
- これだけでスマホにインストール済みの各種Android Auto用アプリ(Googleマップ等)をDHUの画面に表示できるようになりました
- Mac(環境2)の場合はアクセサリ モードを使用して接続する(DHU 2.0 のみ)の方法で実行できたので楽でした
- 【トラップ2】Windows(環境1)の場合はADB トンネリングを使用して接続するの方法でしか実行できなかったのでちょっと詰まりました
- Android Studioで
helloworld.mobile
をスマホにインストール - DHU上の◉ボタン(多くの場合、画面下部の角にある)をタップ
- DHU上でランチャーが表示されるので、その中の「カスタマイズ」をタップ
スマホ上でAndroid Autoアプリの設定の
ランチャーのカスタマイズ
が開かれるので、Hello World
の横のチェックボックスにチェックを入れる7.だけでは起動済みのDHUに反映されないため、DHUを再起動する
- DHU上で再度ランチャーを開くと
Hello World
アプリが追加されているので、タップして開く - 以下の画面が表示される
【立ちはだかる壁1】サンプルのAndroid Auto用アプリをスマホで動かしてマツコネで表示してみたかったができなかった(悲)
DHUではサンプルアプリが動いたので、次は実車で表示してみよう!と思いましたがダメでした。
下記のスクショの通り、サンプルアプリをインストールしたスマホを開発用PCから外す(DHUから切断する)と、ランチャーのカスタマイズ
画面からサンプルアプリが消えてしまいます。
なので、愛車に接続してもランチャーにサンプルアプリが出現せず、立ち上げることができません。
自動車向け Android アプリをテストするを見てもDHUを用いたテスト方法しか書かれておらず、嫌な予感がしました。
そこで色々公式ドキュメントを漁ってみると、自動車向け Android アプリの品質に
アプリは、Play ストアからインストールされない限り、Android Auto で動作しません。
という記載がありました……4。
なので、次は自動車向け Android アプリを配布するを参考にしてPlay Storeでの公開に挑戦してみます。 (追記: 障壁が多すぎて頓挫中……)
しかしながらAndroid Auto用アプリの要件はかなり厳しく、所定の用途のアプリしか許されていない他、自動車向け Android アプリの品質のビジュアル デザインとユーザー操作と機能に示された要件を満たさければならず、更にAndroid Automotive OSへの両対応も必要なようで、前途多難です。
【立ちはだかる壁2】せめてDHU上だけでもいいからUnityの画面を表示したかったがスマホ側の画面にしか出せなかった(悲)
サンプルのhelloworld.mobile
が最もコンパクトな実装になっているので、これを参考にしつつUnityのAndroid用ビルドを改造していくことにしました。
UnityをAndroid向けにビルドする際、Android Studio用プロジェクトをエクスポートできるので、空っぽのUnityプロジェクトで空っぽのSceneだけをエクスポートしました。
Unityからエクスポートしたものとhelloworld.mobile
を見比べると、Unityではandroid.app.Activityを継承したUnityPlayerActivity
クラスで画面を表示するのに対して、androidx.car.app.Screenを継承したHelloWorldScreen
クラスで画面を表示する実装になっています。
後者は具体的には、
- androidx.car.app.Screenを継承した
HelloWorldScreen
クラスを実装onGetTemplate()
にてandroidx.car.app.model.Templateのインスタンスを返す
- androidx.car.app.CarAppServiceを継承した
HelloWorldService
を実装onCreateSession()
にてandroidx.car.app.Sessionのインスタンスを返す- この際、
Session.onCreateScreen()
でHelloWorldScreen
のインスタンスを返すようにする
- この際、
AndroidManifest.xml
内の<service>
でHelloWorldService
クラスを指定
という風になっています。
公式ドキュメントを見ても、そのようにすべきと書かれています。
フォアグラウンドサービスとしてアプリを動作させるため、このような実装になっているのだと思います。
なので、なんとかしてScreenを継承したクラスでTemplateにUnity画面をねじ込まなければなりませんでしたが、アドベントカレンダーには間に合いませんでした(泣)
なお、ナビ画面上にScreenを表示しつつ、同時にスマホ画面上にUnityPlayerActivityを表示することには成功したため、それについては後日記事にします!
今後の展望
UnityPlayerActivityと同等の処理をScreen+Templateで実装できるか頑張ってみます。
また、Unity as a Libraryならばうまくできるのではないか、というのも試してみようかと思います。
うまくいったら、Play Storeの審査に通るようにアプリを作り込んで審査に出してみます。
どうしてもActivityでしか(スマホ側の画面にしか)表示できないようであれば、Android Automotive OS5用アプリ専用のandroidx.car.app.activity.CarAppActivityを用いて作れないか試してみます(こちらは残念ながらマツコネに表示できませんが)。
おわりに
さて、本来の目的は果たせなかったものの、明確な課題点が見つかったので引き続き挑戦してみます!
明日のAkatsuki Games Advent Calendar 2022の記事はYusuke Nakajimaさんの記事です。 お楽しみに!
-
マツダコネクト(通称、マツコネ)のv1を搭載しているグレード(ロードスターRF VS Terracotta Selection)のAndroid Auto対応の年式(2022年式)のものを買いました。Androidスマホの場合はAndroid Auto機能を使えますが、iPhoneの場合はApple Car Play機能を使えます。なお、他のグレードではマツコネ非搭載だったりします。またマツコネ搭載グレードでも、古めの年式だとAndroid Auto非対応(Apple Car Playのみ対応の場合もある)なこともあります。2022年現在はUSB接続のみに対応しています。また、Android Autoの操作方法には「タッチ操作のみ(
touch
)」「タッチ操作+コントローラ操作(hybrid
)」「コントローラ操作のみ(rotary
)」の3種類があります。少なくとも私のロードスターRFの場合はジョグダイヤル等をrotary
のみに対応しているようです。2018年マツダ技報の2. Apple CarPlay及びAndroid Auto
の2.4 開発注力ポイント
の(1) 安全性対応
(P.57) によると、マツコネのためにマツダとGoogleが協業してrotary
の対応が行われたそうです(Apple Car Playも同様とのこと)。↩ - 2022年現在のAndroid 12以降の話に限ります。また、似たような名前にAndroid Automotive OSというものもありますが、別モノの技術です。↩
- スマホ上で開発者モードの有効化やUSBデバッグの有効化等、事前に必要な作業がいくつかありますが、今回のAndroid Auto用アプリ実行に限った話ではないため、ここでは割愛します。↩
-
ランチャーのカスタマイズ
画面から消えていることに気がつくまでは、愛車のランチャーに表示されない他の理由も考えました。愛車が対応しているAndroid Auto APIが古すぎるから説については、AndroidManifestのmeta-detaによりAPI Level 1でも動作するようビルドした(今回はandroidx.car.appの1.3.0-alpha01を使ったため最新のAPI Level 5に対応している)ため違いました。また、愛車がコントローラ操作のみしか受け付けていない(DHU起動時のコマンドラインオプションに--input=rotary
をつけたときと同じ動作)から説については、DHUでrotary
としたときはランチャーからGameSnacks
6が消えるのに対してHello World
等のサンプルアプリは消えないので、これも違いました。↩ - Android Automotive OSは、車のインフォテインメントシステム用組み込みOSの一種です。Android Autoとは異なり、車載のコンピュータ上でアプリを動作させます(スマホ不要)。採用されている車は非常に少ないながらも、Polestar 2等のボルボ車に採用されているようです。Android Automotive OS向けであれば、Unity Technologiesが提供しているAutomotive HMI テンプレートを用いて楽に実装できるかもしれません。Android Automotive OS用アプリの場合はAndroid Automotive OS 用のアプリをテストするを参考にして実験できそうです。↩
-
(おそらく)Android Autoにプリインストールされているミニゲーム集。ミニゲーム一覧画面ではコントローラ操作も受け付けますが、ミニゲーム自体はタッチ操作しか受け付けません。なお、ミニゲームの中の
2048 Giant
という2048ライクゲームが面白かったです。↩