Oculus Integration を用いた テレポート / ワープ の実装方法 [Oculus Quest]
Oculus Integration だけで テレポート を実装します.
他のテレポート方法だと伊藤さんのこちらのqiita記事かな.
- 実行環境
- セットアップ準備
- 実装
- 土台を準備する
- 一人称プレイヤーを作る
- Oculus Touchを表示させる
- Simple Capsule With Stick Movement
- Character Camera Constraint
- Locomotion Controllerを作る
- Teleport Input Handler Touch
- Teleport Aim Visual Laser
- Teleport Target Handler Physical
- Teleport Aim Handler Laser
- Teleport Orientation Handler Thumbstick
- Teleport Transition Instant
- 実機
- 終わりに
実行環境
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をアタッチし,下記の画像のように設定してください.
VRPlayerControllerを親として,OVRCameraRigプレハブを配置します. (Positionについて何も言及がない場合は以降,Position[0,0,0]とします.) OVRCameraRigですが,Tracking Origin TypeをFloor Levelに設定しましょう.
Oculus Touchを表示させる
OVRCameraRigの下の階層にある,LeftControllerAnchorにOculusTouchForQuestAndRiftS_Leftプレハブを, RightControllerAnchorにOculusTouchForQuestAndRiftS_Rightプレハブを配置します.
Simple Capsule With Stick Movement
VRPlayerControllerにSimple Capsule With Stick Movementコンポーネントをアタッチします. Simple Capsule With Stick MovementコンポーネントはOVRPlayerControllerのように スティック移動を行うことが出来,また,テレポート移動の際に必要になるスクリプトです. Speedを4,Camera Rigは先ほどHierarchyに配置したOVRCameraRigをD&Dして下さい.
Character Camera Constraint
VRPlayerControllerにCharacter Camera Constraintコンポーネントをアタッチします.
このコンポーネントは,HMDに合わせてキャラクターカプセルを移動させたり,
衝突時にカメラをフェードアウトしたり,動きをブロックしたり,HMDの地面からのオフセットに
合わせてキャラクターカプセルの高さを調整したりする役割を持ちます.
Camera RigにOVRCameraRigをD&D,Preferred Heightを2にします.
Capsure ColliderのHeightが2ですので,Preferred Heightもそれに合わせています.
ここまでが移動処理になります.
Locomotion Controllerを作る
VRPlayerControllerを親として,空オブジェクトを生成します. 名前をLocomotionControllerとしました.
LocomotionControllerにLocomotion 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します. このプレハブは,テレポートする際のインジケーターのようなオブジェクトです.
Locomotion とは
まあ「移動」という意味です.VRでよく研究テーマにされています.
LocomotionについてはOculus ドキュメントを参照してください. https://developer.oculus.com/design/bp-locomotion/
こちらにはVRにおける移動方法に関するノウハウが解説されています. ちなみにですが,Oculusドキュメントは日本語対応されている箇所がいくつかあり, 画面遷移するとエラーページが出る場合がありますので,その時は英語で読みましょう.
ここから長い作業です. Transform,Locomotion Controller,Locomotion Teleportを畳むことをオススメします.
Teleport Input Handler Touch
テレポート移動のための入力処理を実装します.
Locomotion ControllerにTeleport Input Handler Touchコンポーネントをアタッチします.
Aim Button,Teleport ButtonをL Thumbstickに設定します.
Left HandにはLeftControllerAnchor,Right HandにはRightControllerAnchorをD&Dし,
Input ModeをL Touchに設定します.
ここは個々人で自由にカスタマイズしてもかまいません.
Teleport Aim Visual Laser
エイムレーザーを視覚的に出させます. Locomotion ControllerにTeleport Aim Visual Laserコンポーネントをアタッチします. Laser PrefabにはTeleport LaserプレハブをD&Dします.
直線的ではなく,放物曲線を描くようなレーザーを出したい場合は, Teleport Aim Visual Parabolicコンポーネントをアタッチしてください.
Teleport Target Handler Physical
テレポート先を指定したい場合にこちらのコンポーネントをアタッチしLayer Maskを使います. Locomotion ControllerにTeleport Target Handler Physicalをアタッチします. [Project Settings]→[Tags and Layers]→[Layers]→User Layer 8にTeleportLayerを入力します.
このレイヤーを指定したオブジェクトを照準した時にだけテレポできるようにします. PlaneのLayerをTeleportLayerにします.これで床限定でテレポできます
また,Aim Collision Layer MaskにTeleport Layerを設定します. そして最後に,Locomotion TeleportコンポーネントのTeleport Destination Layerを8に設定します. Teleport LayerがNo.8なので,8ということです.
Teleport Aim Handler Laser
レーザー限界距離を指定します. Locomotion ControllerにTeleport Aim Handler Laserをアタッチします. Rangeは今回100にしました.
Teleport Orientation Handler Thumbstick
テレポート移動後にどの方向に向くかをコントローラで指定できるようにします. Locomotion ControllerにTeleport Orientation Handler Thumbstickコンポーネントをアタッチ.
ThumbstickをR Touchにしました.
Teleport Transition Instant
このコンポーネントをアタッチすることで,エフェクトなしでプレイヤーを瞬時にテレポートさせます. フェードアウトをはさみたい場合は,Teleport Transition Blinkコンポーネントをアタッチしましょう. VR酔いを発生しにくくしたい場合はBlinkの方を使う方がいいと思います.
Locomotion Controllerはこんな感じでコンポーネントだらけになります. 以上です.お疲れさまでした.
実機
こんな感じです.
テレポ pic.twitter.com/98WGDr6RrH
— Denik (@xrdnk) 2020年3月24日
左スティックでテレポ先を指定し,離すとテレポートします. テレポ先を指定中に,右スティックを操作するとランディング後の向きを指定できるようになってます.
床の時だけレーザーが緑になってテレポができるのがお分かりでしょうか.
逆に,Cubeにレーザーが当たっているときとか,床のエリア外の所だと赤くなっています.
終わりに
以上のテレポート実装はUnity Sample FrameworkのLocomotionのSample Sceneを参考にしてます.