Mirage Solo 向けアプリを Daydreamで配信する

はじめに

Mirage Solo買った当初から「これからはスタンドアロン6DoFのVRの時代だ」と思い、もっと練習したいなと思っている卓球を題材にアプリを作りました。 コントローラーは3DoFで色々と不便なところはありますが、せっかく作ったのでとりあえずアプリ公開してみました。

Daydreamアプリの公開は経験がなく、日本語情報も(悲しいことにストアのコンテンツ数も...)少ないので何かと苦労するかと思い、雑ですが公開に当たってつまずいたことをまとめます。

環境

作成したアプリ:

https://play.google.com/store/apps/details?id=com.yhrscoding.TableTennisDaydream

www.youtube.com

アプリの申請方法

基本的には通常のAndroidアプリのようにgoogle play consoleでapkをアップロード、説明文、画像を入れて公開です。
しかし、通常のAndroidアプリと異なりDaydream向けの配信はgoogleの審査が必要です。審査基準は以下の公式サイトに乗っています(英語です)
https://developers.google.com/vr/distribute/daydream/publishing-requirements

ボタン等をHMDの向き等ではなく、コントローラーでクリックするとかDaydreamロゴを使わないといったことを除けば、Daydream向けアプリ固有で必要な設定はおおよそ以下になると思います。

1. Daydreamにアプリを配信することを示す
Google Play Console上で、ストアでの表示 -> 価格と配布 -> ユーザープログラム -> Daydream -> Daydreamにアプリを配信しますにチェック(ここにチェックが入れば更新のたびに審査に自動でかけられるようです)

2. 公開するアプリの頭の動きの激しさを示す(VR酔いの原因となるとされる実空間の動きとVR空間の動きの乖離が自分のアプリにどれだけあるかで回答が変わります)
Google Play Console上で、Daydream->動きの有無で公開予定のアプリの動きの激しさを3段階のどれかにする。なお頭の動きの激しさについては、審査基準のページに書いてありました。

Virtual motion is a major contributor to user discomfort in VR applications. Virtual motion is defined as changing the position or rotation of the user's virtual head position (and hence camera) without the user performing those movements using their own head at 1:1 scale. ...

とりあえず以下のような大まかなまとめです。コントローラーの動きの激しさは関係なく、要はユーザーに見える景色がユーザーの頭の移動以外でどれだけ変化するかでレーティングが変わります。

  • ユーザー自身が頭を動かしたことでVR空間上でも同距離だけ頭が移動する通常のmotionだけならランクは一番下の No Motion (0 degrees of freedom)
  • 平面上の移動をコントローラで行うようなアプリ(ユーザーの頭の動きではなく、コントローラー等の操作がVR表示の変化を起こす)かつ移動に急な加減速を含まないアプリはModerate Motion (2 degrees of translated virtual motion)  
  • 急な加減速、2自由度を超える動作を含むアプリはIntense Motion (2+ degrees of virtual motion)

    例として、今回の卓球のアプリのように、ユーザーの頭の位置がそのまま反映されるだけのアプリはNo Motion。エレベータのボタンを押すと昇降したり、ボタンを押せば前に進むようなアプリはModerate Motion。激しい加減速を含むジェットコースターや、アップダウンのあるコースを動くスキーのアプリなどはIntense Motion。という感じになるようです。

3. VRアイコンをアプリで設定する
Unity上でPlayer Settings -> XR Settings -> Virtual Reality SDKs -> Daydreamで「Foreground Icon」 と 「Background Icon」にそれぞれ画像を設定しなければいけません(Foreground Iconが背景透明な浮き出たせたいものの画像、Background Iconはその他の背景?のようです)

4. 全天球キャプチャー画像をアップロードする
Google Play Console上で、ストアでの表示 -> ストアでの掲載情報 -> 画像および映像 -> Daydreamの360度立体画像 に4096x4096の全天球画像(4096x2048の同じ画像を上下に配置して4096x4096でOK)をアップロードします。
なお全天球キャプチャーは以下のアセットを使いました。
https://assetstore.unity.com/packages/tools/camera/360-screenshot-capture-112864

使い方は以下のレポジトリのreadmeに書いてあるコードをほぼそのままスクリプトに貼り付け、ゲームオブジェクトにアタッチしてその関数を呼び出せば360画像が保存されます。(保存先はログに出てきます)
https://github.com/yasirkula/Unity360ScreenshotCapture

補足

全天球画像を上下に並べるのは以下のアプリ(mac)を使いました。(mac標準搭載の画像のビュアーの編集機能を使って並べることもできるようですが、微妙に上下の配置がおかしかったらしく、1回目のリジェクトの1項目になってしまったのでアプリで正確に並べました。)
https://itunes.apple.com/jp/app/hua-xiangno-dakisawo-jianete/id980577198?mt=12&ign-mpt=uo%3D4

1回目の審査結果

以下の4つの理由によりリジェクト

App eligibility issues:
  • Daydream app has a 360 Stereoscopic image The app must include one 360-degree stereo image to indicate it is a Daydream app. The majority of the image provided is not lined up properly causing double vision for the user. This issue is especially apparent when looking left, right, and down.
    -> 上述のストアの掲載情報の360度立体画像に関する指摘。上下が微妙にずれているよということらしい。上述のアプリでしっかりと揃えました。
APK Version(s) Eligibility Issue
  • The app does not use the Daydream controller properly The app makes use of head gaze when menu UI are present. For more information about controller guidelines, please see the Daydream App Quality Requirements.
    -> UIボタンをクリックする際にコントローラー+HMDの向きの両方が操作手段として入っているという指摘のようです(Canvas にGvrPointerGraphicRapycasterだけでなく、GraphicRaycasterもアタッチされたままだったため)。これを受けてGraphicRaycasterを無効にしました。
  • The app is missing a VR icon The app is missing a VR icon or the icon does not meet our requirements. The VR icon contains the Unity logo as a placeholder image. Guidelines and requirements for the assets can be found in the Daydream App Quality Requirements.
    -> VR iconが無い(Unityロゴが出てるぞ)との指摘。上述のForeground IconとBackground Iconを設定しないといけない。審査基準読んでいなかったために指摘された凡ミス。アプリのスクショを2つとってgimpで背景除去した物をForeground Iconにもう一つをBackground Iconに設定しました。
f:id:hygradme:20180804022610p:plainf:id:hygradme:20180804020539p:plainf:id:hygradme:20180804020430p:plain
  • Motion Intensity Rating You must correctly select one of three Motion Intensity levels for your app. For descriptions of the Motion Intensity levels, please see the Daydream App Quality Requirements.
    -> アプリの動きの激しさに関する自己申告を3段階中一番激しいものにしたがそんなに激しく無いという評価を受けたようだ。とりあえず一つ下のランクに変更した(ここで上の審査基準を読んでおけばよかった... 再度リジェクト食らう結果になった...)

2回目の審査結果

APK Version(s) Eligibility Issue
  • App does not maintain high performance with 6 degrees of freedom The app does not meet our performance standards for standalone devices. Make sure you are not enabling v-sync.
    ->アプリが6DoFでハイパフォーマンスを維持できないから、v-syncを無効化しろということらしい。とりあえず、Edit -> Project Settings -> Quality -> Others の「V sync Count」を「Every V Blank」から 「Don't sync」に変更しました。

  • Motion Intensity Rating App experience does not match with Motion Intensity needs to be set as No Motion. You must correctly select one of three Motion Intensity levels for your app. For descriptions of the Motion Intensity levels, please see the Daydream App Quality Requirements.
    -> アプリの動きの激しさに関する自己申告を3段階中真ん中のものにしたら、またもや間違えで今度は親切に「君のアプリはNo Motion」だと言われた。ここで審査基準をしっかりと読んでやっと理解した。

3回目の審査結果

Thanks for submitting your app for Daydream. We accepted TableTennis6DoF ...

無事審査を突破しアプリがDaydreamに配信されました。