6
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

VIVE Input Utility for UnityでVRアプリをVIVE Focus Plus/PCVR 両対応する。

Last updated at Posted at 2019-09-19

#はじめに

VIVE Focus Plusでアプリを作るときはVive Wave SDKを使うのが基本ですが、それに加えてVIVE Input Utility for Unityを使うことで、 コントローラーの入出力をPCVRにも対応させることが出来ます。これにより、VIVE Focus Plus/PCVR両対応のアプリを作ったり、VIVE Focus PlusのデバッグにVIVEやOculus Riftを使うのが簡単になります。正直、Vive Wave SDKについてくるサンプルより使いやすいのでお勧めです。

公式の情報は、上記のGithubサイトか、少し古いですがこちらのドキュメンテーションをご覧ください。

#プロジェクトのセットアップ
Unity新規プロジェクト(今回はUnity2019.2.2f1を使用)を作ったら、VIVE Input Utilityをアセットストアからダウンロード、インポートしてください。
image.png

次にVive Wave SDKをダウンロード、インポートしてください。今回使うのはWave SDK 3.1.1 (Beta)です。インポートしたら、WaveVRのDefault Preference Dialogを開いて、Accept Allボタンを押してプロジェクトの設定を行ってください。

image.png

image.png
すると、ビルドターゲットがAndroidになりますが、コンパイラエラーが出てしまいます。
image.png
これは、コンパイラエラーを起こしているWaveVRModule.csの641行をコメントアウトすればOKです。
image.png
さらに、Project SettingsのOther SettingsのGraphic APIsでVulkanの選択肢を消してください。
image.png

これでOKです。

#シーンのセットアップ

基本的なシーンのセットアップの方法は、公式チュートリアルの通りで問題ありません。Vive Waveでは、通常はVive Wave付属のカメラリグを使いますが、VIVE Input Utilityを使う場合は、そちらに付属のViveCameraRigを使うので注意してください。

#ボタンタッチ、入力

基本的な使い方は以下の通りです。スクリプト本体の一番上にusing HTC.UnityPlugin.Vive;を入れるのを忘れないでください。

  • 右手、タッチパッドのタッチ
    ViveInput.GetPressEx(HandRole.RightHand, ControllerButton.PadTouch)

  • 右手、タッチパッドの押下
    ViveInput.GetPressEx(HandRole.RightHand, ControllerButton.Pad)

  • 右手、コントローラーのメニューボタン押下
    ViveInput.GetPressEx(HandRole.RightHand, ControllerButton.Menu)

左手の時はHandRole.LeftHandとなります。ボタンはほかにもControllerButton.Trigger, ControllerButton.Gripが使えます。

タッチパッドを触る、押したときの位置はそれぞれ

  • ViveInput.GetPadAxisEx(HandRole.RightHand)
  • ViveInput.GetPadPressAxisEx(HandRole.RightHand)

で取得できます。

それぞれの操作に対しては、コールバックを設定することもできます。例えば、

ViveInput.AddPressDown(HandRole.RightHand, ControllerButton.Trigger,OnPressDown);

により、右手のトリガーを押下した時にOnPressDownを実行できます。同様に、AddPress, AddPressUp, AddClickも可能です。

取り消すときは以下の通りです。

ViveInput.RemovePressDown(HandRole.RightHand, ControllerButton.Trigger, OnPressDown);

コントローラーの位置、回転

コントローラーの位置、回転はそれぞれ以下の方法で取得します。

  • VivePose.GetPoseEx(HandRole.RightHand).pos
  • VivePose.GetPoseEx(HandRole.RightHand).rot

コントローラーの右手、左手

Vive Focus Plusでは、最初に接続したコントローラーが「右手」の「役割 Role」になります。また、片方しか接続していない場合は、それが「右手」になります。そのため同じコントローラーでも頻繁に「右手」「左手」が入れ替わるため、その変更を検知する必要があります。

これらの状態は、コントローラーのゲームオブジェクトにアタッチされているVive Pose Trackerコンポーネントから参照できます。まず、コントローラーが接続された、解除されたときのイベントは

  • vivePoseTracker.onIsValidChanged.AddListener(UnityAction)

で取得できます(ここでvivePoseTrackerは、Vive Pose Trackerコンポーネントへの参照を持つ)。ここで与えるUnityActionはOnRightDeviceEnabled(bool state)のように、bool型を引数とします。

接続されたときに、コントローラーが右手の役割であるかは

  • vivePoseTracker.viveRole == ViveRoleProperty.New(HandRole.RightHand)

でわかります。

また、一旦コントローラが接続された後の右手、左手の役割の変更は

  • vivePoseTracker.viveRole.onRoleChangedEx += OnRightDeviceRoleChanged

で取得できます。この時、与えるメソッド(ここではOnRightDeviceRoleChanged)は

  • OnRightDeviceRoleChanged(System.Type previousRoleType, int previousRoleValue)

の形になります。これにより、変更前のRoleがわかるようになっています。RoleTypeの名前が知りたければpreviousRoleType.FullName を使ってください。

#PCVRでの実行

VIVE Input Utilityを使ってVive Focus Plus向けに作ったシーンは、そのままViveやOculus Riftでも実行できます。残念ながら、Oculus Questでは動きません。

Oculus Riftの場合、メニューボタンがAボタンになり、タッチバッドがスティックになるので注意してください。

6
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?