節電鯖民の遊び場

02-SteamVR:OculusTouchのコントローラーの情報を取得してみる

最終更新:

mcforum

- view
メンバー限定 登録/ログイン

目次


参考


環境

  • Unity 2019.1.0f2
  • SteamVR Plugin 2.2.0
    • プロジェクトへのインポート時に出るダイアログ類は大体YesかAcceptAllする

0.プロジェクト設定

  • 0.1.「Edit」→「Project Settings...」でPlayerのXR Settingを有効化、OpenVRが一番上に来るようにしておく。必要があるとかなんとか…

1.Oculusのアクションの設定

  • 1.1.「Window」→「SteamVR Input」でダイアログを開く
  • 1.2.「Action Sets」の[+]ボタンを押して新しいセットを追加 ※名前は小文字にする必要がある?
  • 1.3.「Actions」の[+]タブを押して各アクションを追加していく
Name Type
Trigger vector1
Trigger_Touch boolean
Grip vector1
JoyStick vector2
JoyStick_Touch boolean
JoyStick_Click boolean
Button_A boolean
Button_B boolean
Button_X boolean
Button_X_Touch boolean
Button_Y boolean
Button_Y_Touch boolean
Right_Skeleton boolean \skeleton\hand\right
Left_Skeleton boolean \skeleton\hand\left
※参考サイトに従ってAとBのTouchは用意していないが用意すべきかもしれない
※Skeletonの定義はよくわかってない
※[\skeleton\hand\left]がクリックで選択しても選択できない時があった。何かの拍子に選択できた。プルダウンでright/left切り替えてたらか・・・?選択できないAction削除して再作成したりもした。
※上手くいかない場合、Advanced SettingsからDelete generate input folderして再度generateしてみたり、プロジェクトを再作成する…
※振動させる場合はoutでvibrationの出力を一つ作っておく。

  • 1.4.一旦「Save and generate」ボタンで生成する
  • 1.5.「Open binding UI」ボタンを押して、ブラウザの画面へ
※ここでブラウザに何も表示されない場合、Actionの設定が誤ってる(コンパイルエラーしてる?っぽい)場合がある。

  • 1.6.現在のバインドの「編集」を押して編集画面に入る
※ここで、上部のタブに自分で追加したActionSetの名前が表示されてなかったら何か間違ってるかミスってるかバグ

  • 1.7.追加したActionSetを選択して、後は各部の使用方法をそれっぽいのを選んでActionを設定していく。ここで何故かアクションが出ない場合、ActionのType指定とか誤ってるかもしれない。

  • 1.8.一通り設定したらデフォルトバインドの置換を実行する?
※ソースコードから察するともしかするといらない可能性もあるなぁ…

  • 1.9.ブラウザの設定画面とSteamVR Inputの画面を閉じる

2.入力値を画面に出す

  • 2.1.適当なシーンを作成
  • 2.2.「SteamVR」→「Prefabs」から[CameraRig]をSceneにドロップして配置する
  • 2.3.カメラから見える位置に 3D Text オブジェクトでも浮かべておく
  • 2.4.適当なAssetsディレクトリを掘ってC#の新規スクリプトを作成。参考サイトの「SteamVR Plugin 2.0のコントローラーの入力系の覚え書き」のソースコードをもとにデバッグ文成形処理を記述する。

ほぼコピペ、3点変更してある
  • 「入力取得方法2 右手」の処理はどうも__actions_系が無さそうな雰囲気なのでコメントアウト+Text2も削除
  • Text1は 3D Text配置したのでTextMeshにした。表示できれば何でも良い
  • start()内のActivatePrimaryは2.2.0で削除されてるようなので、カンで「myAction.Activate(SteamVR_Input_Sources.Any);」にした。

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. using Valve.VR;
  6.  
  7. public class MyInput : MonoBehaviour
  8. {
  9. //取得する手(右手か左手か任意の手)
  10. public SteamVR_Input_Sources handType;
  11.  
  12. //default以外のActionSetを取得する
  13. public SteamVR_ActionSet myAction;
  14.  
  15. //入力取得方法1定義
  16. public SteamVR_Action_Single Trigger;
  17. public SteamVR_Action_Boolean Trigger_Touch;
  18. public SteamVR_Action_Single Grip;
  19. public SteamVR_Action_Vector2 JoyStick;
  20. public SteamVR_Action_Boolean JoyStick_Touch;
  21. public SteamVR_Action_Boolean JoyStick_Click;
  22. public SteamVR_Action_Boolean Button_X;
  23. public SteamVR_Action_Boolean Button_X_Touch;
  24. public SteamVR_Action_Boolean Button_Y;
  25. public SteamVR_Action_Boolean Button_Y_Touch;
  26. public SteamVR_Action_Boolean Button_A;
  27. public SteamVR_Action_Boolean Button_B;
  28. public TextMesh text1;
  29.  
  30. void Start()
  31. {
  32. //default以外のActionSetを取得できるように設定
  33. //myAction.(true);
  34. myAction.Activate(SteamVR_Input_Sources.Any);
  35. }
  36.  
  37. void Update()
  38. {
  39. string output = "";
  40.  
  41. //左手の値を取得するように設定
  42. handType = SteamVR_Input_Sources.LeftHand;
  43.  
  44.  
  45. //入力取得方法1 左手
  46. //Vector1,2,3は変数名.GetAxisで取得
  47. output += "Trigger = " + Trigger.GetAxis(handType) + "\n";
  48.  
  49. //booleanは変数名.GetStateで取得
  50. output += "Trigger_Touch = " + Trigger_Touch.GetState(handType) + "\n";
  51.  
  52. output += "Grip = " + Grip.GetAxis(handType) + "\n";
  53. output += "JoyStick = " + JoyStick.GetAxis(handType) + "\n";
  54. output += "JoyStick_Touch = " + JoyStick_Touch.GetState(handType) + "\n";
  55. output += "JoyStick_Click = " + JoyStick_Click.GetState(handType) + "\n";
  56.  
  57. output += "Button_X = " + Button_X.GetState(handType) + "\n";
  58. output += "Button_X_Touch = " + Button_X_Touch.GetState(handType) + "\n";
  59. output += "Button_Y = " + Button_Y.GetState(handType) + "\n";
  60. output += "Button_Y_Touch = " + Button_Y_Touch.GetState(handType);
  61.  
  62. text1.text = output;
  63.  
  64. output = "";
  65.  
  66. //右手の値を取得するように設定
  67. handType = SteamVR_Input_Sources.RightHand;
  68.  
  69. //入力取得方法2 右手
  70. /* #region Input_2
  71.   output += "Trigger = " + SteamVR_Input.__actions_myinput_in_Trigger.GetAxis(handType) + "\n";
  72.   output += "Trigger_Touch = " + SteamVR_Input.__actions_myinput_in_Trigger_Touch.GetState(handType) + "\n";
  73.   output += "Grip = " + SteamVR_Input.__actions_myinput_in_Grip.GetAxis(handType) + "\n";
  74.   output += "JoyStick = " + SteamVR_Input.__actions_myinput_in_JoyStick.GetAxis(handType) + "\n";
  75.   output += "JoyStick_Touch = " + SteamVR_Input.__actions_myinput_in_JoyStick_Touch.GetState(handType) + "\n";
  76.   output += "JoyStick_Click = " + SteamVR_Input.__actions_myinput_in_JoyStick_Click.GetState(handType) + "\n";
  77.  
  78.   output += "Button_A = " + >SteamVR_Input.__actions_myinput_in_Button_A.GetState(handType) + "\n";
  79.   output += "Button_B = " + SteamVR_Input.__actions_myinput_in_Button_B.GetState(handType);
  80.  
  81.   text2.text = output;
  82.  */
  83. }
  84. }
  85.  

  • 2.5.作成したスクリプトを適当に空オブジェクトを作って貼り付け
  • 2.6.スクリプト貼り付けたオブジェクトクリックして、スクリプトのパブリック変数を全部インスペクターウインドウで埋める。
※プルダウンからそれらしい名前のを一通り選択するだけでいい。myActionは作成したActionSet名を指定する。
※テキストオブジェクトだけ貼り付けた3D Textなどをドロップして設定してやる



とりあえず値が取れてるのでヨシ




謝辞
本ページ内で使用されているUnity-Chan!は以下の著作・ライセンスの元使用しています。
© Unity Technologies Japan/UCL
http://unity-chan.com/contents/license_jp/
目安箱バナー