UnityでのマルチプラットフォームVR開発(Vive、Oculus、PlayStation VR対応)

[Vision VR/AR Summit 2016](http://visionsummit2016.com/)で行われた、オリジナルVRコンテンツ[Job Simulator](http://jobsimulatorgame.com/)で有名なOwlchemy labsの講演の動画
[**"Multiplatform VR - Shipping a Vive, Oculus and Playstation VR title in Unity"**](https://youtu.be/Xu7rmcudGNI)
を見て訳したものをまとめました。
Unityで１つのコンテンツ(Job Simulator)をVive、Oculus、PSVRと三つのプラットフォーム全てに対応して得られた知見についての講演です。内容が盛りだくさんでしたので、qiitaにもまとめてみました。
訳ドキュメントはこちらです。
[Multiplatform VR - Shipping a Vive, Oculus and Playstation VR title in Unity：Vision AR/VR Summit 2016 (私家版日本語訳) ](https://docs.google.com/document/d/17gTviITFYlBnC_-yvTwbcdlkZS2mqiPydibt4NbV9m8/edit?usp=sharing)
自分の勉強を兼ねて訳してみたので、ここ違うよ！とかこの方がいいよ！とかありましたらぜひコメント等でお教えいただけたらとてもありがたいです。


#マルチプラットフォーム対応のVR開発について
##目標
JobSimulatorをVive、Oculus Rift、Playstation VRの三つのプラットフォームに対応できるように同時平行で開発していく上での目標は三つ。

- プレイヤーがどのプラットフォームでも**高いクオリティの体験**ができる。
- 他のプラットフォームからの**「移植」という感じにしない**
- プレイヤー側で余計な調整をしなくて済むように、**開発側で全てのカスタマイズ**をする

##技術編

###Unityプロジェクトは1つにする
全てのプラットフォームを**１つのプロジェクト**にまとめて、そこからプラットフォームごとにビルドする
プロジェクトごとに**ブランチをわけない**
ブランチをわけると、最初は合理的に感じるけれど、後から統合する時に非常にたいへんになる

###HMD、コントローラー、オーディオは共通で使えるものを用意する
**3つのプラットフォームで同様に機能するようなHMD、コントローラー、オーディオ**を設定して、
ゲームのコード自体には、実行時のプラットフォームが何かわからなくても問題がないように作る。
全てのコントローラーの入力を１つのAPIに統合する。
この方法で、たとえ４つ目のプラットフォームを追加したい時にも簡単に追加できるようになった。

###カスタムビルドパイプラインを作る
Unityからは１つのPC(またはPS4)の大きなくくりのビルドを、細かく分けてVRチェックボックスの状態やシーンを管理できるようにパイプラインを作る。
"Oculus Build"、"Vive Build"などプラットフォームごとだけでなく、さらに細かく用途別に"Press Build"、"Demo Build"、または特定のデモ向けに"CES Build"などに分ける。

###DLLプラットフォームマトリクスを作る
PC用のSDKで作ったのにPS4でビルドしたりビルドエラーやコンフリクトが起きないように、DLLの表を作る。

##デザイン編
###プラットフォーム間の共通性を探す
まずはターゲットとしている**プラットフォームの共通点**を探す。
コントローラーの場合以下の３つの共通点があって、これは開発者にとっても使いやすい。

- 1対1のポジショントラッキング
- トリガーがある
- ボタンがある

###コントローラーの形状の違いに対応する

-  コントローラーモデル：コントローラーの形そのままだと、他のプラットフォーム特有の形状に対応できないのでお勧めではない。
-  ハンドモデル：コントローラーを握った**本物の手の位置に手のモデルがあるとより手のプレゼンスが上がる**。各コントローラーに対して"手のレジストレーション"をするのがお勧め。

###トラッキング範囲の違いに対応する
各プラットフォームのトラッキング範囲は異なる。
トラッカーの視野を遮ってトラッキングが失われると、不快でイライラする体験になってしまう。
**コントローラーは頭よりトラッキングを失いやすい**ので、注意。

####トラッカー１つの場合(例 PlayStation VR)

*動画は[こちら](https://youtu.be/Xu7rmcudGNI?t=13m15s)から。スライドに図が表示されます。*

- トラッカーのFOVによって横方向の移動が制限される
- トラッカーの正面から**45°以上**回ると、内側の手が外側の手に遮蔽される
- さらに後ろを向くと、身体で両方の手のトラッキングが遮蔽される

####前面にトラッカー2つの場合(例　Oculus Touch)

*動画は[こちら](https://youtu.be/Xu7rmcudGNI?t=14m)から。スライドに図が表示されます。*

- 横方向の移動はトラッカー1つの時より広範囲(遮蔽された分をもう１つのトラッカーが補える)
- トラッカーの正面から**90°以上**回ると、内側の手が外側の手に遮蔽される可能性がある

####対面にトラッカー2つの場合(例　Vive)

*動画は[こちら](https://youtu.be/Xu7rmcudGNI?t=14m23s)から。スライドに図が表示されます。*

- ほとんど全ての遮蔽を防げる
- **360°**回転できる
- デザイナーもプレイヤーも「前方」の設定を考慮しなくて良い
- トラッカーが高い位置にあるほど、片手によって遮蔽されるエリアが斜め下に角度がつくため、もう片方の手を遮蔽しにくくなる
- セッティングが大掛かりなのでプレイヤー環境の想定は必要

###トラッカーからの距離

- **トラッカーから離れるにつれて正確さは低下**するので各プラットフォームのガイドラインで、トラッカーからの距離について確認する
- ゲームデザインの段階で気をつける
- プレイヤーの環境も考慮する

###床からの高さ
立ってプレイする場合、ユーザーが自分の本当の身長だと感じられるのは大事。
まだプラットフォーム共通で床の高さを合わせるツールはないけど、先々は出てくるのでは。

###自分のゲームに合うプラットフォームをサポートしよう！
ゲームと相性の合わないプラットフォームに合わせてゲームの質を下げるともったいないので、自分のゲームと相性が良いプラットフォームにだけフォーカスする。
(例

- Job Simulatorは立って手を使って遊ぶ→Vive、 Oculus(Touch)、PSVRの三つをサポート
- 視点を使う基本操作のゲーム→ポジショントラッキングがないモバイルVR対応もできる。



##パフォーマンス編

パフォーマンスはVRで一番の優先事項。最適化は最重要事項。

###Job Simulatorのパフォーマンスの目標

3つのプラットフォーム全てで以下のパフォーマンス

- 90FPS
- 1.4倍の解像度
- 8×MSAA
- 90Hzの物理計算
- シャドウクオリティ"Very High"

###最適化で役に立ったこと

VRとモバイルは両方とも高解像度でGPUのパワーが制限されてしまうという点で最適化に共通点が多い。(例：iPadのRetinaディスプレイ等)
VRで最適化に困ったら、VRの最適化だけでなくUnityのモバイルの最適化について調べてみるのがお勧め。

###最適化でよくある間違い

１つのプラットフォームで最適化したことが、別のプラットフォームではパフォーマンスを損ねる結果になることがある。
プラットフォームごとに固有の性質がある。それぞれのプラットフォームでどこがボトルネックとなっているのか知るために、プラットフォームごとにプロファイラーを使って調べる。


###Job Simulatorの最適化の場合

####全てのプラットフォーム共通

メモリアロケーション
ガベージコレクタはVRでは敵。ガベージコレクタができる限り起動しないように、VR機能のためのビルトインのSDKを除いて、1フレームあたり数百byteまでメモリアロケーションを削減。

####PC(Oculus、Vive)
GPUバウンド
解像度が非常に高いため

####PSVR
CPUバウンド
UnityのMainスレッドがすべてやってくれているけど、他にもTransparenciesを減らしたり、Overdrawを減らしたりした。

###その他のVR最適化Tips
 
####**90FPS**のアップデートループを保っているか開発初期から気をつける。
開発後期にゲームコードに関わる所が原因で変更しようとするとたいへん。

####**最小スペック**のマシンでも開発する
ハイエンドマシンだけで開発していると、パフォーマンスの問題に気づきにくい。
初期から常に最小スペックのマシンでも開発をしてパフォーマンスのチェックをする。

##なぜマルチプラットフォーム対応するのか


###開発者にとっての利点
**VRはまだ今始まったばかり**。各デバイスが市場に出る数も多くない。
マルチプラットフォーム化すると

- **より多くのユーザーに見てもらえる**
- コンテンツクリエイターとして**リスク軽減**できる。
- 開発者として各コミュニティとのつながりと知名度が築ける

###VR全体にとっての利点

 - 単独のデバイスに依存せざるを得なくなるより、**複数のデバイスが存在する方がVRにとって健全**
 - 競争はVRの発展にとって素晴らしいこと
 - 排他的なのは、特に初期である今には有益ではない
 - VRにとってのベストケースは、Vive、Oculus、PSVR全てが成功して、**１つのプラットフォームに縛られない状態**であること。

##まとめ
VRはすごいスピードで常に進化し続けていて、そして、今はまだ始まったばかり。
VRマルチプラットフォーム開発は、これからさらにさらに簡単になっていく。
**だからみんなVRマルチプラットフォーム開発をやろう！**




以下の訳ドキュメント作成にあたり、[@takashijona](https://twitter.com/takashijona)さん、[@hammmm](https://twitter.com/hammmm)さん、[@GOROman](https://twitter.com/GOROman)さんからコメントをいただき教わりました！ありがとうございます！
[Multiplatform VR - Shipping a Vive, Oculus and Playstation VR title in Unity：Vision AR/VR Summit 2016 (私家版日本語訳) ](https://docs.google.com/document/d/17gTviITFYlBnC_-yvTwbcdlkZS2mqiPydibt4NbV9m8/edit?usp=sharing)