はじめに
本記事はUnity #2 Advent Calendar 2019 の14日目の記事です。
フリーロームVRをマルチプレイヤーで実現するためにはプレイヤーのトラッキングが必要となり割と大掛りな機器が必要となります。
それをOculus Questのガーディアンだけでそこそこの精度で実現できたので紹介したいと思います。
フリーロームVRとは
フリーロームVRとはプレイヤーがフィールド内を自由に歩き回る事が可能なVRコンテンツで以下のような施設があります(ありました)
Oculus Questの設定
ホーム画面でルームスケールに設定して歩ける範囲をガーディアンの境界線を引きます。以下の図は境界線とそれを元に生成されたプレイエリア(四角形の領域)です。
この時にマルチプレイで使用するOculus Questでほぼ同じプレイエリアを作るのが位置合わせで重要になってきます。
床の四隅にガムテームなどで┌
、┐
、└
、┘
のような形で目印を作りそのラインに沿って境界線を引くとほぼ同じプレイエリアができあがります。
Unityの設定
- Oculus Integrationをインポートします。
-
OVRCameraRig
プレハブやOVRPlayerController
プレハブをヒエラルキーに追加します。 - このプレハブにアタッチされている
OVRManager
を探し、Tracking
>Tracking Origin Type
をStage
に変更します。
Tracking Origin Type
がEye Level
かFloor Level
ではプレイヤーのXZ座標はヒエラルキーに配置した位置のままですが、Stage
にするとゲームの原点座標(0,0,0)はプレイエリアの中心になり、プレイヤーのGameObjectはプレイエリアの中心を基準にした位置に移動します。この仕組みによって実際に歩く領域とゲーム内の位置を合わせる事ができます。
プレイエリアの問題
ルームスケールのプレイエリアで複数台のOculus Questの位置トラッキングができそうですが1つだけ問題があります。
ゲームの原点とプレイエリアの中心を合わせる事はできるのですがY軸が回転してZ軸の向きが原点から4辺のいずれかになり確定することができません。
つまり、同じ領域のプレイエリアを作っても0°、90°、180°、270°のいずれかに回転してしまうので、プレイヤーのTransformを同期しても位置が合わない事があります。
この問題をオペレーションなしに解決して正面方向を合わせる方法として以下の手順を考えました。
- プレイエリアを4等分する。(十字型でも×でもよい)
- プレイヤーの初期位置を4等分した領域のいずれかに配置して正面方向も固定する。たとえば(3, -3, 0)を初期位置、このPositionに対してforwardを正面方向とするならback、right、leftを向かないこと。
- ゲームを開始して数フレーム以降にプレイヤーが正面を向いていなければプレイエリアが回転しているので原点を中心にプレイヤーのGameObjectを回転する。プレイヤーが右を向いているとプレイエリアは90°回転なのでプレイヤーのGameObjectを-90°回転する。
ゲーム開始直後だとプレイヤーの位置が反映されていないのでAwake
やStart
を使えません。ネットワークライブラリで同期する直前あたりでフェードインして回転補正すると無難だと思います。もっと良い方法があればコメントで教えていただけると助かります。
回転補正前のプレイエリアとプレイヤーの位置と向きのパターン
まとめ
Oculus Questのガーディアンすごい!