UnityからOculus Goへ書き出してみる

<2018/5/31 VRGOの記事から移動>


Oculus Storeのアプリで一通り遊んだら、Oculus Goを買った当初の目的であるアプリ作りの第一歩を踏み出すことにしました。

一応、Oculus Goなりの書き出し方があるだろうとググり、こちらのページ(Oculus Go とUnityとMacで始めるVR開発)を参考にさせていただきました。

使ってるUnityは2017.2なので、設定は以下のような感じです。

Oculus GoはAndroid7ベースなので、Minimum API Levelは7.1にしてます。


これが最も要のVR書き出し設定です。
Stereo Rendering MethodをSingle Passにするとエラーが出るshaderがいたりしたので、Multi Passにしています。
(でも、Oculus Goを含む非力なMobile系は、パフォーマンス的にSingle Passを使った方が良さそうなことが公式のDeveloper Centerに書かれているので、Single Passが間違いなさそうです。


Qualityはお好みですね。面倒くさいのでFantasticにしています。

書き出し方法さえ分かれば、UnityからのVR書き出しはスマホVRで既にお試し済みなので、Build And RunでGoへ書き出してみました。

ところが、、、

この時の動画ではないのですが、高速に首を振った際に黒い枠がチラチラすることがあります。
さらに、、、

いきなり厳しい状態でOculus Goに歓迎されました。

気になったのは

  • 開始するとMade with Unityのロゴが左右に分かれて表示される
  • QualityでAntiをx4にしてもジャギーが酷い
  • 左右に黒い枠がチラチラと映り込む

で、明らかにOculus Storeにあったアプリと比べると、全く違う品質状態でした。

試しに他のプロジェクトでも試したところ、

なぜかUnityロゴの不具合は直りましたが、ジャギーと黒い枠が取れません。。。(Goのビデオスクリーンショットはジャギーが出ません。実際にGoを被って見ると出ます。)

で、twitterでこちらのページ(【Unite Tokyo 2018】Oculusで作るスタンドアローン・モバイルVRコンテンツ)を教えていただきました。ここにあるスライドに登場する「おまじない」が、まさに救いの神でした。

この3つのコードは、最初に読まれるソースのvoid Start(){ }内に突っ込んでます。
これでジャギーは出なくなりました(厳密に言うと、白いエッジラインなどがチラつきます。これはアンチエイジングの工夫が必要になりそうです)。
ただ、下の2つはOculus UtilityというOculus公式のSDKをUnityプロジェクトに入れる必要があります。(プロジェクト開いた状態で、unitypackageをダブルクリックするだけです)
※公式のDeveloper Centerで解説してます(英語)
あと、3つ目のリフレッシュレートは、できれば使わなくて済む方が良いのかもしれません。

ところが、チラつく黒い枠だけがどうしても消えない。コイツは一体なんなのか?!
その後しばらくして、Oculusの中の人からのtweetで明確な答えを知りました。

つまり、フレーム落ちした状態ってことですね。
原因としては、処理するものが多すぎるようです。
巨大なオブジェクトがあったり、ポリゴン数が凄いオブジェクトが大量にあったり、やたら重そうなテクスチャやエフェクトがあったりです。
ちなみに、先ほどの南の島は、AQUASやUniStorm、Terrainなど重い要素満載な上に、植物系のオブジェクトをてんこ盛りにしています。
このフレーム落ちした状態が発生すると、Oculus Storeの審査に落ちるそうです。

黒い枠の正体は、フレーム落ちで画面がガクガクしても、VR酔いを軽減させるための有難い処理だったんですね。w
邪険にしてごめんなさい。

ここまでで、ひとまずOculus Utilityなどを使ったGoなりのチューニングと書き出し方法が分かりました。


小ネタですが、一度Build And Runしたapkは、Oculus Goのライブラリの提供元不明の一番最後に追加されます。

<追記>

Oculus Goでプレイした自作アプリ(上記のメーヴェに乗るアプリ)を閉じた後に提供元不明から開き直しても、コントローラの向きがおかしくなったり、視野がグルグル回ることがありました。
原因は、Goで自作アプリ閉じても閉じきってないことがたまにある様で、前に開いてたアプリのイベント取得状態がゾンビのように生きてるだけでした。
Go標準の「ギャラリー」とかを開いて閉じた後に、自作アプリを開くとリセットされました。
</追記>