Search Unity

できる限り多くの VR プラットフォームをターゲットにできれば、アプリケーションを幅広いオーディエンスに届けることができます。この記事で説明する Unity 2018.3 の機能を利用すると、プラットフォームに合わせて苦労してビルドする必要なしに、さまざまなデスクトップ VR デバイスやモバイル VR デバイスで動作するスリムで優れたアプリを開発できます。ぜひ最後まで読み、これらの機能を実際に活用しているオープンソースプロジェクトへのリンクを参照してください。

注:この記事の内容は、OpenVR、Oculus、WindowsMR、Daydream、GearVR の SDK に当てはまります。PSVR には当てはまりません。

ビルドターゲットのプラットフォームと VR 用 SDK の選択

まず、基本を確認しておきましょう。

アプリケーションを動作させるデバイスの種類によっては、ビルドターゲットのプラットフォームを変更し、複数回コンパイルしなければならない場合があります。たとえば、Oculus Rift をターゲットとしている場合は、ビルドターゲットのプラットフォームを「PC, Mac, & Linux Standalone」にします。Oculus Go をターゲットとしている場合は、「Android」にします。Oculus Rift と Oculus Go の両方をターゲットにする場合は、ターゲットプラットフォームごとにビルドする必要があります。

ビルドターゲットのプラットフォームの変更については、Unity ドキュメンテーションのビルド設定のページで説明しています。

それぞれのビルドターゲットのプラットフォームについて、適切なバーチャルリアリティ向け SDK をターゲットにする必要があります。1 つの exe で複数の SDK をターゲットにできることもありますが、SDK ごとに別々にビルドする必要がある場合もあります。「PC, Mac, & Linux Standalone」をターゲットにする場合は、Oculus と OpenVR の両方のバーチャルリアリティ向け SDK をターゲットとしてビルドできます。「Android」をターゲットにする場合は、Daydream と Oculus のバーチャルリアリティ向け SDK にあわせて別々にビルドする必要があります。

ターゲットとする各デバイスについて、ビルドターゲットのプラットフォームと VR SDK を適切に選択できるよう、ご自分で必ず試してみてください。

VR の有効化とビルドに合わせた SDK の選択については、Unity ドキュメンテーションの VR 概要のページで説明しています。

Tracked Pose Driver

Tracked Pose Driver は、VR デバイスに従ってトランスフォームの位置と回転を変える優れたコンポーネントです。

これは Tracked Pose Driver を使用した XR リグのスクリーンショットです。XR リグの「Main Camera」、「Left Hand」、「Right Hand」ゲームオブジェクトには、それぞれ TrackedPoseDriver コンポーネントが付けられています。このコンポーネントは、選択したデバイスとポーズのソースの組み合わせに基づき、ゲームオブジェクトのトランスフォームを変更します。VR Lightweight RP テンプレートを使って新しいプロジェクトを作成すると、この XR リグを実際に確認できます。

InputManager

VR 用以外のコントローラーから入力を取得するのと同じ方法で VR コントローラーから入力を取得できることはもうご存知でしょうか?嘘ではありません。ドキュメンテーションの XR 入力のページにある入力対応表を使えば、トリガー、サムスティック、グリップボタンなどの入力を参照できます。

たとえば、左トリガーの Input Manager は次のように設定します。

また、左手側のプライマリーボタンの Input Manager は次のように設定します。

XRNodes

特定のデバイスについて理解を深める必要がある場合は、InputTracking クラスに便利なツールがいくつかあります。

InputTracking.GetNodeStates() を使うと、XRNodeStates というオブジェクトのリストを取得できます。XRNode 型には、Head、LeftHand、RightHand、TrackingReference(たとえば、Oculus Rift のカメラや Vive Lighthouse)など、ノードの抽象的表現が定義されています。XRNodeStates は、ノードの位置や回転など、物理的情報を提供するものです。さらに、ノードのタイプ、ノードが現在トラッキングされているかどうか、uniqueID もわかります。

InputTracking では、ノードが追加または削除されたときや、ノードのトラッキングが失われたときや始まったときに始動するイベントも使用できます。

SDK 固有の詳細設定を有効にする

ユーザー体験の種類によっては、SDK 固有の詳細設定を行わなければならない場合があります。しかし、ご安心ください。私たちがついています。

XRSettings は、構築済みのアプリケーションでどの VR SDK をサポートするか、どの VR SDK がアクティブかなど、XR 関連のグローバル設定を提供します。XRSettings.supportedDevices を呼び出すと、ビルド時に選択された VR SDK のリストが返されます。XRSettings.loadedDeviceName を使うと、現在どの SDK が入力に使われているかがわかります。この設定を使い、ユーザーアクションを駆動する各種の入力の選択など、プラットフォーム固有の設定を有効にすることができます。

 

XRSettings を XRNodes と併用することで、あらゆる VR SDK とそれに対応する各デバイスの UX を通した操作をコントロールできます。

リソース

この記事で取り上げた機能を試してみたくなりましたか?まずは次の 2 つのプロジェクトをチェックしてください。

Onslaught は GitHub 上にある 400 KB 未満のプロジェクトです。OpenVR、Oculus Desktop、Windows Mixed Reality 没入型ヘッドセット、Oculus Mobile(GearVR、Go)、Daydream をサポートしています。Unity Editor 2018.3.0b3 以降をお使いであれば、今すぐお試しいただけます。

XR Input Tests はマルチプラットフォームのテストプロジェクトです。Unity の XR 関連の QA では、毎日このプロジェクトを使用してこの記事で紹介した機能を含めたさまざまな機能の検証をしています。

10 コメント

コメントの配信登録

コメント受付を終了しました。

  1. For the Vive Focus (or rather the Wave Platform which includes other hmds) there’s the following blog entry:
    https://community.viveport.com/t5/Developer-Blog/bg-p/devblog

    To clarify it wasn’t a matter of opting to not use the Unity VR path as opposed to it not really being open to all platforms. And if you’re gong to abstract input at the application level rather than inside the Unity XR framework then you may as well also consider the third party plugins (like VIU) that can also target multiple platforms.

    And then there’s the new OpenVR (and OpenXR I suppose) new input system to also consider…

  2. What about Vive Focus?

    1. Hi Danila, I must admit that I do not have first hand experience with the Vive Focus, but here is what I was able to find out for you:

      I downloaded the SDK and loaded it into an empty Unity project based on these steps: https://hub.vive.com/storage/app/doc/en-us/UnityPluginGettingStart.html

      After walking through the steps, it appears that HTC opted to write their own stack on top of Android. They do not set PlayerSettings -> XR Settings -> Virtual Reality Supported, which means that Unity’s VR path does not have a window into the HTC Wave platform.

      Unfortunately, this means that the features outlined in this article don’t seem to apply to the Vive Focus. I do not have a Vive Focus to verify my findings – could someone who does chime in?

  3. Isaac Surfraz

    11月 26, 2018 2:29 pm

    Please stop spamming these blog posts.

  4. Seems like old news. Maybe the 2 GitHub projects are new?

    1. Yeah, afaik all of these features have been around for a while. However, looking through the repo I spotted a native Unity API for haptics which I’ve never seen before. So maybe that’s new?

    2. Hi Sean, based on my interactions with my local VR community I thought it would be helpful for some if this information was brought together and broadcast as a blog entry. In addition to the features themselves, I hope that you gain some value from seeing the features in action in the two projects, which were produced as part of our internal testing process.

      This article gives an overview of recommended features to use for 2018.3 (not including nice packages such as SteamVR, VRTK, and etc). There are some nice new features coming out for 2019.1 – look for a follow up blog entry introducing these features and explaining our thought process behind them.

  5. Love the idea of the Tracked pose driver (know it for a while). Only thing keeping me away from using Unity’s native stuff is the lack of a Player Physics system (I’m stuck using VRTK’s body physics till I have the time to make my own) and the lack of Haptic rumble (though I think this was added already, just found some code examples I’m going to test later).

    It’s cool about the inputs too, I already new about it but I’ve always preferred to use KeyCodes, I hate extra setup steps (I’d rather do it automatically in code). Setting up all the inputs for Vive and Oculus in the Inputs manager becomes a problem since they´re a lot (so much so, that some people simply share the input settings file to avoid having to go through the pain of setting up the inputs all over again. In my case, I just ended up making my own VR KeyCodes for Vive and Oculus separately that then my Input methods’ overloads use to know what inputs to check from each SDK). Having separate keycode enums makes it easy to select stuff in the editor or even in UI.

    1. Hi Alverik,

      Thanks for the read. In the Onslaught project at the end of the blog post, you will see that for one platform I had to abstract the input for one or two platforms as well due to feature differences. As for setup, I hope you’ll appreciate some new features that are cooking for 2019.1! Look out for a follow up blog post when 2019.1 is in beta detailing these features.

    2. Hi again Alverik,

      Sorry for the delay, but here is a bit of a blog post that talks about collider/rigidbody setups. I hope it will help you with a body physics system if that’s something you’re interested in making:

      http://jackpritz.com/blog/unity-colliderrigidbody-setups-in-xr