Oculus Integration を用いた テレポート / ワープ の実装方法 [Oculus Quest]


Oculus Integration だけで テレポート を実装します.

他のテレポート方法だと伊藤さんのこちらのqiita記事かな.

qiita.com

実行環境

Unity 2019.3.2f1
Oculus Integration 14.0
Oculus Quest
(多分Oculus Rift Sも使えると思う)

セットアップ準備

こちらの記事を一通り終えていることを前提とします.

Unity 2019.3 からの Oculus Quest セットアップ方法 (XR Plugin Management) - デニッキ!

実装

土台を準備する

テレポートするために,床と目印になるものを作りましょう.
床として,[Plane]を生成し,Position,Rotationを0,Scaleを[5,5,5]とします.
目印として,[Cube]を生成し,Positionを[0,1,2],Rotationを0,Scaleを[1,1,1]とします.
マテリアルに適当な色を塗るとよいでしょう.

一人称プレイヤーを作る

空オブジェクトを生成します.Positionを[0,1,0]にします.
名前は「VRPlayerController」としました.
RigidbodyとCapsule Colliderをアタッチし,下記の画像のように設定してください.

f:id:xrdnk:20200324234711p:plain

VRPlayerControllerを親として,OVRCameraRigプレハブを配置します.
(Positionについて何も言及がない場合は以降,Position[0,0,0]とします.)
OVRCameraRigですが,Tracking Origin TypeをFloor Levelに設定しましょう.

f:id:xrdnk:20200324235702p:plain

Oculus Touchを表示させる

OVRCameraRigの下の階層にある,LeftControllerAnchorOculusTouchForQuestAndRiftS_Leftプレハブを,
RightControllerAnchorOculusTouchForQuestAndRiftS_Rightプレハブを配置します.

f:id:xrdnk:20200324235712p:plain

Simple Capsule With Stick Movement

VRPlayerControllerSimple Capsule With Stick Movementコンポーネントをアタッチします.
Simple Capsule With Stick MovementコンポーネントOVRPlayerControllerのように
スティック移動を行うことが出来,また,テレポート移動の際に必要になるスクリプトです.
Speedを4,Camera Rigは先ほどHierarchyに配置したOVRCameraRigをD&Dして下さい.

f:id:xrdnk:20200324235724p:plain

Character Camera Constraint

VRPlayerControllerCharacter Camera Constraintコンポーネントをアタッチします.
このコンポーネントは,HMDに合わせてキャラクターカプセルを移動させたり,
衝突時にカメラをフェードアウトしたり,動きをブロックしたり,HMDの地面からのオフセットに
合わせてキャラクターカプセルの高さを調整したりする役割を持ちます.
Camera RigにOVRCameraRigをD&D,Preferred Heightを2にします.
Capsure ColliderのHeightが2ですので,Preferred Heightもそれに合わせています.

f:id:xrdnk:20200325000040p:plain

ここまでが移動処理になります.

Locomotion Controllerを作る

VRPlayerControllerを親として,空オブジェクトを生成します.
名前をLocomotionControllerとしました.

LocomotionControllerLocomotion Controllerコンポーネントと,
Locomotion Teleportコンポーネントをアタッチします.
この2つのコンポーネントはテレポート実装のために不可欠です.

各々について設定を行います.まず,Locomotion Controllerです.

Camera Rig に OVRCameraRigを,Character ControllerにVRPlayerControllerを,
Player ControllerにVRPlayerControllerをD&Dしてください.

次に,Locomotion Teleportです.
Enable Movement During Aim,Enable Movement During Pre Teleport,
Enable Rotation During Aim, Enable Rotation During Pre Teleportのチェックを外します.
これらをチェックしていると,テレポート先をスティックで指定する時にプレイヤーが移動しまいます.
つまり,テレポート先を固定できなくなってしまいます.

Teleport Destination PrefabにTeleport DestinationプレハブをD&Dします.
このプレハブは,テレポートする際のインジケーターのようなオブジェクトです.

f:id:xrdnk:20200325000105p:plain

Locomotion とは

まあ「移動」という意味です.VRでよく研究テーマにされています.

LocomotionについてはOculus ドキュメントを参照してください.
https://developer.oculus.com/design/bp-locomotion/

こちらにはVRにおける移動方法に関するノウハウが解説されています.
ちなみにですが,Oculusドキュメントは日本語対応されている箇所がいくつかあり,
画面遷移するとエラーページが出る場合がありますので,その時は英語で読みましょう.

ここから長い作業です.
Transform,Locomotion Controller,Locomotion Teleportを畳むことをオススメします.

Teleport Input Handler Touch

テレポート移動のための入力処理を実装します.
Locomotion ControllerTeleport Input Handler Touchコンポーネントをアタッチします.
Aim Button,Teleport ButtonをL Thumbstickに設定します.
Left HandにはLeftControllerAnchor,Right HandにはRightControllerAnchorをD&Dし,
Input ModeをL Touchに設定します.

f:id:xrdnk:20200325000125p:plain

ここは個々人で自由にカスタマイズしてもかまいません.

Teleport Aim Visual Laser

エイムレーザーを視覚的に出させます.
Locomotion ControllerTeleport Aim Visual Laserコンポーネントをアタッチします.
Laser PrefabにはTeleport LaserプレハブをD&Dします.

f:id:xrdnk:20200325000138p:plain

直線的ではなく,放物曲線を描くようなレーザーを出したい場合は,
Teleport Aim Visual Parabolicコンポーネントをアタッチしてください.

Teleport Target Handler Physical

テレポート先を指定したい場合にこちらのコンポーネントをアタッチしLayer Maskを使います.
Locomotion ControllerTeleport Target Handler Physicalをアタッチします.
[Project Settings]→[Tags and Layers]→[Layers]→User Layer 8にTeleportLayerを入力します.

f:id:xrdnk:20200325000153p:plain

このレイヤーを指定したオブジェクトを照準した時にだけテレポできるようにします.
PlaneのLayerをTeleportLayerにします.これで床限定でテレポできます

f:id:xrdnk:20200325000249p:plain

また,Aim Collision Layer MaskにTeleport Layerを設定します.
そして最後に,Locomotion TeleportコンポーネントのTeleport Destination Layerを8に設定します.
Teleport LayerがNo.8なので,8ということです.

f:id:xrdnk:20200325000224p:plain

Teleport Aim Handler Laser

レーザー限界距離を指定します.
Locomotion ControllerTeleport Aim Handler Laserをアタッチします.
Rangeは今回100にしました.

f:id:xrdnk:20200325000323p:plain

Teleport Orientation Handler Thumbstick

テレポート移動後にどの方向に向くかをコントローラで指定できるようにします.
Locomotion ControllerTeleport Orientation Handler Thumbstickコンポーネントをアタッチ.

ThumbstickをR Touchにしました.

f:id:xrdnk:20200325000333p:plain

Teleport Transition Instant

このコンポーネントをアタッチすることで,エフェクトなしでプレイヤーを瞬時にテレポートさせます.
フェードアウトをはさみたい場合は,Teleport Transition Blinkコンポーネントをアタッチしましょう.
VR酔いを発生しにくくしたい場合はBlinkの方を使う方がいいと思います.

f:id:xrdnk:20200325000342p:plain

Locomotion Controllerはこんな感じでコンポーネントだらけになります.
以上です.お疲れさまでした.

実機

こんな感じです.

左スティックでテレポ先を指定し,離すとテレポートします.
テレポ先を指定中に,右スティックを操作するとランディング後の向きを指定できるようになってます.

床の時だけレーザーが緑になってテレポができるのがお分かりでしょうか.
逆に,Cubeにレーザーが当たっているときとか,床のエリア外の所だと赤くなっています.

終わりに

以上のテレポート実装はUnity Sample FrameworkのLocomotionのSample Sceneを参考にしてます.

developer.oculus.com

こちらを読むと理解が深まると思います.
テレポ実装のためにいっぱいスクリプトコンポーネントぶちこんでいるの強い.