#はじめに
初投稿なので文面が拙いですが、よろしくお願いいたします。
SteamVR Pluginでコントローラーからの入力をしようとしたときに2.0では前バージョンの入力形式とは大幅に変わり、取得方法がよくわからないという人の為に記述しようと思います。
#実行環境
・Windows10
・Unity 2018.2.16f1
・SteamVR Plugin 2.0.1
・Oculus Rift + Touch
・Oculusソフトウェア、バージョン 1.32.0
・SteamVR バージョン 1539100633
#前バージョンとの違い
前バージョンとの違いを簡単に表現すると、前バージョンでは始めから用意されていたボタンが、2.0では自分でボタンを用意しなければならなくなった感じです。
全バージョンでは、ViveコントローラーやOculusのTouchコントローラーに対応させた特定の入力方法がありました。しかし、2.0からはその特定の入力方法がなくなり、自分で設定しなければならなくなりました。その要因の一つがKnucklesコントローラーで、5本指すべての入力が可能になったのでこれまで以上に入力方法が増えることになりました。そのことから、今後入力方法が多様化されると考えられたため、自分で必要なコントローラーの入力を設定する方式に変更されたそうです。理由が全然違うのであればすいません。(._.)
自分で設定した項目はactions.jsonで保存されます。
それでは、ここから入力方法の設定を行います。
UnityのプロジェクトにSteamVR Plugin 2.0のアセットをインポートされている段階から始めます。
なお、Oculus Riftの場合、PlayerSettingsでXRSettingsのOpenVRをOculusより上にしないとSteamVRが認識しないそうです。
#Actionの設定
-
actions.jsonがないから作成するような表示が出るのでYesを選択します。
-
以下のような設定画面が出るので、ここで設定します。
Action Setsの欄で用途に応じた入力方法を分けることができます。 -
Action Setsの右端の"+"を選択し、名前を入力します。なお、大文字は後に正常に動かなくなるみたいなので小文字のみで入力します。
-
下のActionsの欄に"+"を選択し、Actionを追加します。
-
Actionsの右側にAction Detailsという設定項目が出てくるので、Trigger等の名前や、そのActionで必要な情報タイプを設定します。
情報タイプの一覧
- boolean
- vector1 (float)
- vector2
- vector3
- pose
- skeleton
主にboolean,vector1,vector2あたりを頻繁に使用すると思います。
設定すると、下のような感じになります。
-
設定が終わったら、Save and Generateでjsonファイルの保存と、入力情報取得時に必要になるファイルの作成が行われます。
#Bindingの設定
Actionの設定後、各Actionにコントローラーのボタンやトリガーを割り当てるためにBindingを行います。
- 先程の設定していた画面の右下のOpen binding UIを選択します。ブラウザが開くので、そこで設定します。
- ブラウザが開いたら、以下のような画面が出てき、Current BindingとあるところのEditを選択します。
- 設定画面が出てくるので、作成したAction Setsのタブを開きます。
- 各項目の"+"を選択し、必要な情報を入力します。(TRIGGERやBUTTON,JOYSTICK等が出てくるので選択した後、各々にあった項目を設定します)
※基本は必要ないと思いますが、真ん中にあるMirror Modeのチェックを外すと左右別で設定することもできます。
設定すると、以下のような画面になります
5. すべて設定した後、右下真ん中のReplace Default Bindingを選択し、Saveで設定を保存します。
これでBindingの設定は終わりです。
#入力値の取得方法
入力値を取得するには2つの方法があります。
1. 変数定義で各Actionを保持させ取得する方法
2. 各Actionを直接指定して取得する方法
また、どちらも共通している方式として
-
using Valve.VR
を記述する - GetState,GetAxisでbool値,float値などを取得
- 引数で右手,左手もしくは両手(どちらか)を選択
があります。
引数のほうはSteamVR_Input_Sources
で指定します
-
SteamVR_Input_Sources.LeftHand
左手 -
SteamVR_Input_Sources.RightHand
右手 -
SteamVR_Input_Sources.Any
両手(どちらか)
また、作成したAction Setsを選択しなければ入力されないので変数として作成します。
public SteamVR_ActionSet myAction;
そして、入力値を取得するタイミング(始めからの場合はStartやAwakeあたり)で取得できるように設定します。
myAction.ActivatePrimary(true);
1つ目の取得方法では変数定義を行う必要があるので定義します。
public SteamVR_Action_Single Trigger
float(vector1)
public SteamVR_Action_Boolean Button
boolean
public SteamVR_Action_Vector2 JoyStick
vector2
型名の最後に設定した型名(Boolean,Vector2等)がつくような形になっています。
そして、以下のようなかたちで値を取得します。
float trigger = Trigger.GetAxis(handType);
bool button = Button.GetState(handType);
Vector2 joystick = JoyStick.GetAxis(handType);
2つ目の取得方法では、変数定義を行う必要がない分、一回の呼び出しの取得が長くなります。
型は以下のようになります。""で括ったところに各設定値を記述してください。
SteamVR_Input.__actions_"Action Setsの名前"_"Actionで追加した箇所(in,out)"_"actionの名前"."GetAxis,GetState(handtype)
例
float trigger = SteamVR_Input.__actions_myinput_in_Trigger.GetAxis(handType);
bool button = SteamVR_Input.__actions_myinput_in_Button.GetState(handtype);
のようになります。
上記で記述した取得方法で右手、左手の入力をTextで表示させるコードを以下に記述します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Valve.VR;
using UnityEngine.UI;
public class MyInput : MonoBehaviour {
//取得する手(右手か左手か任意の手)
public SteamVR_Input_Sources handType;
//default以外のActionSetを取得する
public SteamVR_ActionSet myAction;
//入力取得方法1定義
public SteamVR_Action_Single Trigger;
public SteamVR_Action_Boolean Trigger_Touch;
public SteamVR_Action_Single Grip;
public SteamVR_Action_Vector2 JoyStick;
public SteamVR_Action_Boolean JoyStick_Touch;
public SteamVR_Action_Boolean JoyStick_Click;
public SteamVR_Action_Boolean Button_X;
public SteamVR_Action_Boolean Button_X_Touch;
public SteamVR_Action_Boolean Button_Y;
public SteamVR_Action_Boolean Button_Y_Touch;
public SteamVR_Action_Boolean Button_A;
public SteamVR_Action_Boolean Button_B;
public Text text1;
public Text text2;
void Start () {
//default以外のActionSetを取得できるように設定
myAction.ActivatePrimary(true);
}
void Update () {
string output = "";
//左手の値を取得するように設定
handType = SteamVR_Input_Sources.LeftHand;
//クソザココード
//入力取得方法1 左手
//Vector1,2,3は変数名.GetAxisで取得
output += "Trigger = " + Trigger.GetAxis(handType) + "\n";
//booleanは変数名.GetStateで取得
output += "Trigger_Touch = " + Trigger_Touch.GetState(handType) + "\n";
output += "Grip = " + Grip.GetAxis(handType) + "\n";
output += "JoyStick = " + JoyStick.GetAxis(handType) + "\n";
output += "JoyStick_Touch = " + JoyStick_Touch.GetState(handType) + "\n";
output += "JoyStick_Click = " + JoyStick_Click.GetState(handType) + "\n";
output += "Button_X = " + Button_X.GetState(handType) + "\n";
output += "Button_X_Touch = " + Button_X_Touch.GetState(handType) + "\n";
output += "Button_Y = " + Button_Y.GetState(handType) + "\n";
output += "Button_Y_Touch = " + Button_Y_Touch.GetState(handType);
text1.text = output;
output = "";
//右手の値を取得するように設定
handType = SteamVR_Input_Sources.RightHand;
//入力取得方法2 右手
#region Input_2
output += "Trigger = " + SteamVR_Input.__actions_myinput_in_Trigger.GetAxis(handType) + "\n";
output += "Trigger_Touch = " + SteamVR_Input.__actions_myinput_in_Trigger_Touch.GetState(handType) + "\n";
output += "Grip = " + SteamVR_Input.__actions_myinput_in_Grip.GetAxis(handType) + "\n";
output += "JoyStick = " + SteamVR_Input.__actions_myinput_in_JoyStick.GetAxis(handType) + "\n";
output += "JoyStick_Touch = " + SteamVR_Input.__actions_myinput_in_JoyStick_Touch.GetState(handType) + "\n";
output += "JoyStick_Click = " + SteamVR_Input.__actions_myinput_in_JoyStick_Click.GetState(handType) + "\n";
output += "Button_A = " + SteamVR_Input.__actions_myinput_in_Button_A.GetState(handType) + "\n";
output += "Button_B = " + SteamVR_Input.__actions_myinput_in_Button_B.GetState(handType);
text2.text = output;
}
}
また、変数を設定しなければならないので、GameObjectにアタッチした後に設定します。
取得中の動画です。
SteamVR Plugin 2.0でOculus Touchの入力を取得した動画 pic.twitter.com/WtrImAblEs
— 天翔龍はたぽん@μ'sicForever (@TitaniaioEuropa) 2018年11月22日
また、「window」タブから「SteamVR Input Live View」を開いても入力を取得しているかを確認することができます。
#おわりに
長々と読んで頂きありがとうございました。
まだ、自分もよくわからないところがあるのでこれで入力系をすべて理解できてはいないのですが、基本的な入力はできるようになると思います。
これからも少しずつ記事を書いていければと思います。
#参考サイト
SteamVR Plugin 2.0 セットアップ・サンプルシーンを動かすまでの備忘録
SteamVR Plugin 2.0 Input取得・入力関連スクリプト読み解き
【Unity】SteamVR Plugin 2.0の入力方法を調べてみた
The new SteamVR Input System and Unity
etc...