初鹿デニック氏(以下、初鹿):「XR Interaction Toolkit 1.0.0-preでVR開発してみよう」という題で発表します。よろしくお願いします。

自己紹介です。名前は初鹿デニックと申します。TIS株式会社でXRエンジニアをやっています。本発表は個人の見解で、所属組織の意見ではありません。よろしくお願いします。アジェンダはこのようになります。

まず「XR Interaction Toolkit」について説明をします。XR Interaction ToolkitはUnityが提供するVR/ARインタラクションシステムのツールキットです。似たようなツールでOculusが「Oculus Integration」を提供しています。

XR Interaction Toolkitは、2019年12月頃にpreview packageとして公開されてからはしばらくアップデートがなかったんですが、2020年の10月ぐらいにバージョン0.10が公開されて、約10ヶ月ぶりに新機能が追加されています。今は1.0.0-pre版が出ていて、リリース目前です。本発表ではVRの機能について説明します。VR側では以下の機能が提供されています。

本発表での検証環境はこのようになっています。XR Interaction Toolkitは0.10からいくつかの機能が追加されていて、どのバージョンから対応されているかは右下のラベルに表示しています。始めにインストール方法ですが、Unity Package Managerを通してインストールします。preview packageなのでShow preview packagesにチェックする必要があります。

「Interaction」の機能

機能の紹介に入ります。まずは「Interaction」です。登場人物はInteractorとInteraction ManagerとInteractableの3者です。InteractorはInteractionの主体で、主にプレイヤーのコントローラーを指します。InteractableはInteractionの客体で、物体やUIパネルなどを指します。

この2者の状態がホバー状態なのかどうかを通知するためにInteraction Managerというマネージャークラスが存在します。この神クラスが存在しないと、お互いの状態がどうなっているかを知ることができないので、この3者は必要です。

ここから機能を淡々と説明していきます。「XR Ray Interactor」でコントローラーからRayを出せます。Rayは間接に遠隔物体をつかむような感じで、ほかにもDirect Interactorがあって、これはコントローラーで直接インタラクションできます。

あとは「Socket Interactor」というのがあって、以前の位置というのは語弊があるかもしれませんが、この物体の向こうに格納できます。このコライダーの範囲にキューブが入ると判定されて、そこから手を離すとここに格納が戻ります。

先ほどの物体に「XR Grab Interactable」をアタッチするとつかめるようになります。ほかにも「XR Simple Interactable」があって、XR Grab InteractableからGrab機能を取り除いたものです。

Interaction Systemには状態があります。先ほどホバーやセレクトは説明しましたが、ホバーの場合、物体にRayが触れた瞬間にHoverEnteredになって、放れたらHoverExitedというイベントが発火します。またつかんだ瞬間にSelectEnteredの状態になって、離すとSelectExitedの状態になります。これらをInteractor、Interactable Eventsと言います。イベントにはこのように処理を登録できます。

コントローラーにはAudio、HapticのEventsがあって、Interactable Eventsが破壊されたときにこのように音や振動を追加できます。もちろんEventsなどは、スクリプトを通してこのように追加できます。

「Locomotion System」に追加された2つの機能

次に「Locomotion」です。XR Interaction Toolkitでは以下のような「Locomotion System」が提供されています。0.9以前まではこの2つしかなかったんですが、2020年の10月頃に出た0.10からは、2つの機能が追加されています。

まず、「Snap Turn Provider」という機能があるんですが、これは瞬発的な視点回転処理を行えます。あとは「Teleportation Provider」というのがあって、これでテレポート処理を実行できます。テレポート先の判定は、平面のAreaと点のAnchorの2種類があります。テレポーテーション設定でMatch Orientationというのがあるんですが、これは少し混乱しやすいので次のスライドで説明します。

Match Orientationは、テレポート処理後の向きの設定です。0.9以前と0.10以降でこのEnumの内容が変わっているので注意してください。最初にWorld Space Upがあるんですが、これはワールド空間のy軸に合わせて、テレポートあとはワールドのy軸に合わせます。

次にTarget Upですが、ワープ先のy軸に合わせます。ワールド先のy軸と合っていないとプレイヤーはこのように向きが横向きになってしまうので、注意してください。

もう1つ、Target Up and Forwardがあるんですが、これはワープ先のyz軸に合わせます。最後にNoneがありますすが、これはワープ処理の前の向きと同じです。なのでワープ前の向きが正常だったら正常なんですが、おかしいままでワープしてしまうとおかしいままで変わりません。

個人的にはWorld Space Up以外はVRより向きになるので設定するときは注意してください。

ここからは0.10から追加されている機能を説明します。「Continuous Turn Provider」は変則的に視点を回転する処理ができます。もう1つ、VR空間内で移動処理を行える「Continuous Move Provider」があります。

Enable Strafeという項目があって、ストライフ移動は横移動のことを言うんですが、ここを有効にするかしないかという設定があります。ここのチェックを外すと前後移動しかできなくなります。

あとは「Character Controller Driver」が0.10から追加されました。これがなかったときは、現実空間でかがんでも、VR空間内ではCharacter Controllerの高さが変わらないために、VR空間ではかがめないという悲しいことが起きていたんですが、このCharacter Controller Driverを使えば、現実空間で頭の高さを変えるとCharacter Controllerの高さも変わります。

あとは0.10からInput System対応版が追加されました。対応しているのは以下の4つのコントローラー操作関連の機能です。Input Manager版はDevice-basedになっていて、Input SystemはAction-basedというスクリプトに名前が書かれるようになりました。

「XR Device Simulator」も0.10で追加されて、エディタ上でVRコントローラー操作を行えるようになりました。

「XR Interaction Toolkit」を応用したサンプルを紹介

XR Interaction Toolkitを応用したサンプルを紹介します。Socket Interactorを継承して独自のクラスを使えば、このように手首にモノを収納できるリストポケットを作れます。

XR Grab Interactableを拡張すれば、両手持ちの物体も実装できます。右手で銃を持って、左手でエイムの調整を行うギミックも搭載できます。

おわりに、ちょっと横道に逸れますが、近々Unity WebXRでXR Interaction Toolkitが対応される予定です。XR Interaction Toolkit Roadmapが公開されていて、将来はRemote Input Debuggerや、ハンドトラッキング、両手インタラクションが追加される予定です。

フォーラムによると、XR Interaction ToolkitはUnity 2021.2で1.0.0リリースを目指しているようです。後ほどスライドを公開するので参考にしてください。

最低限の実装は「XR Interaction Toolkit」で可能

まとめです。XR Interaction Toolkitを利用すれば、VRインタラクションシステムのひと通りの実装ができます。XR Interaction ToolkitはUPMを利用していて、アセットを置く必要がないので、Oculus Integrationに比べてリポジトリの容量が増えません。ただ必要最低限のコンポーネントしかないので、機能を拡張したい場合は拡張クラスを作るか、Oculus Integrationなど他のSDKと組み合わせて使うのがいいかもしれません。

ご清聴ありがとうございました。

司会者:ありがとうございました。それでは質疑応答の時間に移ります。「Oculus Integrationと比べたときのメリットはどのあたりなのか?」と質問が来ています。

初鹿:そうですね(笑)。Oculus Integrationはけっこうアセットに容量を食うんですが、XR Interaction ToolkitはUPMを利用しているので、容量が増えません。最低限の実装はXR Interaction Toolkitでいいんじゃないかと思います。

司会者:ありがとうございました。