ろうでんのブログ

ただのブログ

マツダ車の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対応の多機能なナビ(?)が搭載されています1

マツコネの画面にGoogleマップを表示してルート案内している様子

せっかくなのでAndroid Autoアプリを自分で作ってみたいなと思い立ちました。

Android Autoというのは、(誤解を恐れずに言えば)Android搭載スマホ上で動作するアプリの画面を車の画面に表示して操作できるようにする技術の一つです2

マツコネを含むAndroid Auto対応ナビはあくまでもインタフェースとして動作するだけで、Android Auto用アプリはあくまでも接続されたスマホ上で動作します。

Unityを用いたゲーム開発で飯を食ってる身なのでUnityでAndroid Auto用アプリを作れないかネット上で軽く調べてみたところ、Unity Forumに「作れなかった(細かい情報はナシ)」という古〜いスレッドが2つ見つかった (1, 2 だけだったので、やりようがあるのではないかと思い、トライしてみました(そして前人と同じ末路を辿りました)。

実験環境

Windowsでの実験環境 (環境1)

Macでの実験環境 (環境2)

サンプルのAndroid Auto用アプリをビルドしてみる

Android Auto用アプリのサンプルプロジェクトがGoogleによって複数公開されており、少なくともAndroid for Cars App Library samplesUniversal Android Music Player sampleMedia Controller Test sampleというものがありました。

今回はこの1つ目のAndroid for Cars App Library samplesを題材にします。

  1. GitHubから公式サンプルのリポジトリをclone
  2. car_app_libraryフォルダをAndroid Studioで開く
  3. 【トラップ1】helloworldautomotivecommonmobileのそれぞれに対応するbuild.gradle内のdependenciesのimplementationにあるapp-automotiveappapp-projectedのバージョン1.2.0-rc011.3.0-alpha01に変更する(参考
    • これをやらないとビルドできませんでした
  4. それぞれのproject (helloworld, navigation, places, showcase) をビルド

サンプルのAndroid Auto用アプリをスマホで動かしてエミュレータで表示してみる

Android DeveloperのAndroid Auto 用のアプリをテストするを参考にしました。

ありがたいことに、Googleが提供するDHU(Desktop Head Unit)というツールを使うことでPC上でAndroid Auto対応ナビをエミュレートでき、スマホ上で動作するAndroid Auto用アプリをテストすることができます。

試していませんが、実機のスマホだけでなくAndroid Emulatorでもテストできるはずです。

  1. DHU バージョン 2.0 をインストールするを参考にしてインストール
  2. スマホをPCに接続3
  3. DHU を実行するを参考にして実行
  4. Android Studiohelloworld.mobileスマホにインストール
  5. DHU上の◉ボタン(多くの場合、画面下部の角にある)をタップ
  6. DHU上でランチャーが表示されるので、その中の「カスタマイズ」をタップ
  7. スマホ上でAndroid Autoアプリの設定のランチャーのカスタマイズが開かれるので、Hello Worldの横のチェックボックスにチェックを入れる

  8. 7.だけでは起動済みのDHUに反映されないため、DHUを再起動する

  9. DHU上で再度ランチャーを開くとHello Worldアプリが追加されているので、タップして開く
  10. 以下の画面が表示される

【立ちはだかる壁1】サンプルのAndroid Auto用アプリをスマホで動かしてマツコネで表示してみたかったができなかった(悲)

DHUではサンプルアプリが動いたので、次は実車で表示してみよう!と思いましたがダメでした。

下記のスクショの通り、サンプルアプリをインストールしたスマホを開発用PCから外す(DHUから切断する)と、ランチャーのカスタマイズ画面からサンプルアプリが消えてしまいます。

左: DHU接続中, 右: 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クラスで画面を表示する実装になっています。

後者は具体的には、

という風になっています。

公式ドキュメントを見ても、そのようにすべきと書かれています。

フォアグラウンドサービスとしてアプリを動作させるため、このような実装になっているのだと思います。

なので、なんとかして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さんの記事です。 お楽しみに!


  1. マツダコネクト(通称、マツコネ)の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 Auto2.4 開発注力ポイント(1) 安全性対応(P.57) によると、マツコネのためにマツダGoogleが協業してrotaryの対応が行われたそうです(Apple Car Playも同様とのこと)。
  2. 2022年現在のAndroid 12以降の話に限ります。また、似たような名前にAndroid Automotive OSというものもありますが、別モノの技術です。
  3. スマホ上で開発者モードの有効化やUSBデバッグの有効化等、事前に必要な作業がいくつかありますが、今回のAndroid Auto用アプリ実行に限った話ではないため、ここでは割愛します。
  4. ランチャーのカスタマイズ画面から消えていることに気がつくまでは、愛車のランチャーに表示されない他の理由も考えました。愛車が対応しているAndroid Auto APIが古すぎるから説については、AndroidManifestのmeta-detaによりAPI Level 1でも動作するようビルドした(今回はandroidx.car.appの1.3.0-alpha01を使ったため最新のAPI Level 5に対応している)ため違いました。また、愛車がコントローラ操作のみしか受け付けていない(DHU起動時のコマンドラインオプションに--input=rotaryをつけたときと同じ動作)から説については、DHUでrotaryとしたときはランチャーからGameSnacks6が消えるのに対してHello World等のサンプルアプリは消えないので、これも違いました。
  5. Android Automotive OSは、車のインフォテインメントシステム用組み込みOSの一種です。Android Autoとは異なり、車載のコンピュータ上でアプリを動作させます(スマホ不要)。採用されている車は非常に少ないながらも、Polestar 2等のボルボ車に採用されているようです。Android Automotive OS向けであれば、Unity Technologiesが提供しているAutomotive HMI テンプレートを用いて楽に実装できるかもしれません。Android Automotive OS用アプリの場合はAndroid Automotive OS 用のアプリをテストするを参考にして実験できそうです。
  6. (おそらく)Android Autoにプリインストールされているミニゲーム集。ミニゲーム一覧画面ではコントローラ操作も受け付けますが、ミニゲーム自体はタッチ操作しか受け付けません。なお、ミニゲームの中の2048 Giantという2048ライクゲームが面白かったです。