たこやき部屋

SteamVRを使って、Unityでゲームを開発したい

「SteamVR Unity Toolkit」で物を掴む

2020/09/12時点ではこちらが最新です。
takoyakiroom.hatenablog.com



VRTK Ver2.2.1の記事です。
Ver3になって使い方が色々と変わっています。ついでに名前も「SteamVR Unity Toolkit」から「Virtual Reality Toolkit」へ変わっています。
使い方はこちらの記事を参照してください。
takoyakiroom.hatenablog.com(以上、2017/02/04 追記)


はい、今回はゲーム作りをちょっと中断して「SteamVR Unity Toolkit」を使って、Viveコントローラで物を掴む方法について調べていきます。

まずはこのページだけ観ている方の為、Unityで新しいプロジェクトを作った所から説明していきますね。

Unityで新しいプロジェクトを作り、Asset Storeから「SteamVR Plugin」をダウンロード・インポート。
f:id:takoyakiroom:20161015155659j:plain

続けて、同じくAsset Storeから「SteamVR Unity Toolkit」をダウンロード・インポート。
f:id:takoyakiroom:20161015155701j:plain

元々あった「Main Camera」は要らないので、バッサリ削除!
f:id:takoyakiroom:20161015155703j:plain

代わりに「SteamVR」→「Prefabs」→「[CameraRig]」をドロップします
f:id:takoyakiroom:20161015155705j:plain

「Cube」で床を作って「Material」で緑色にして"作業場"が完成。
実行するとVR上に何もない空間が出来ています。
f:id:takoyakiroom:20161015155706j:plain


さてここからが本題、Viveコントローラで物を掴むには「[CameraRig]」→「Controller(left)」に「VRTK_Interact Grab」のスクリプトを追加します。
右のコントローラでも掴めるようにするには「Controller(right)」にも同様にスクリプトを追加します。
f:id:takoyakiroom:20161015154158j:plain

「VRTK_Interact Grab」を追加すると、抱き合わせ商法のように色々とスクリプトが追加されました!
f:id:takoyakiroom:20161015154200j:plain
これで、コントローラ側の設定は終わり。

次は、掴む用のオブジェクトを作っていきましょう。
オブジェクト(Sphere)を配置して「Physics」→「Rigidbody」を追加し、物理演算できるようにします。
んで「VRTK_Interactable Object」のスクリプトを追加。
f:id:takoyakiroom:20161015154203j:plain

「VRTK_Interactable Object」の「Inspector」の「Is Grabbable」をチェックします。
これ忘れると、掴む事が出来ないので要注意。
f:id:takoyakiroom:20161015154205j:plain
実行すると配置したSphereがコントローラのグリップボタンを押すことで、掴めるようになります。

色々と設定可能な項目がありますが、「Grab Options」の主要そうなところだけどんな効果があるのか書いておきます。
(「Touch Option」はその名の通りオブジェクトに触れた時の挙動、一番下の「Is Usable」は「VRTK_InteractUse」と一緒に使うらしいですが、ここでは割愛します)

項目 効果
Is Grabbable 掴めるようになる。
Is Droppable オブジェクトが落とせる。Offにしたらずっとコントローラにくっついている。
Is Swappable 左右のコントローラでオブジェクトの持ち替えができる。
Hold Button To Grab ボタンを押している間だけ掴んでいる。
Grab Override Button 掴むボタンをグリップボタン以外の別のボタンに割り当てる。
Rumble On Grab オブジェクトを掴んだ時にコントローラを振動させる。
Precision Grab(Snap) ボタンを押したところでオブジェクトが固定される。(これにチェックしない場合、オブジェクトの中心に掴んでいる位置が移動します)
Hide Controller On Grab 掴んでいる時はコントローラを消す。
Grab Attach Mechanic オブジェクトのくっつき方。Spring_joint、Track_Object等が指定できます。
Detach Threshold Objectの「掴みやすさ」がしっくりくるかも。この値が小さいと別のオブジェクトにぶつかった時に、オブジェクトを落としやすくなります。掴んでいるのに持ち上がらない、すぐに落としてしまうとかいった場合は、この値を大きくすると解決する時があります。
Throw Multiplier 大きな値にすると、オブジェクトを投げた時により遠くに投げられます。

コントローラ側の「VRTK_InteractGrab」にも設定可能な項目がいくつかありますが、上の表と同じ挙動になります。
f:id:takoyakiroom:20161015170516j:plain
尚、「Create Rigid Body When Not Touching」はグリップボタンを押している間、コントローラに「Rigidbody」が付きます。
これによりコントローラでオブジェクトが押せるようになります。


最後に、サンプルプログラムを作ったので遊んでみてね。
https://dl.dropbox.com/u/110351779/app/Grab.zip

実行すると以下のオブジェクトが出てきます。
「VRTK_InteractableObject」を色々と変えています。またコントローラ側の設定はデフォルトのまま変えていません。

普通 デフォルトの設定です。
Spring Joint コントローラとバネで繋がっているような挙動になります。掴んだら確実にコントローラを振り回したくなります。
Preciosion Grab(Snap) コントローラで掴んだところを持ちます。(他のオブジェクトは端っこを掴んでもオブジェクトの中心に移動します)
Throw Multiplier=5 投げた時に遠くまで飛びます。すっ飛んでいきます。
Mass=100 重くて持ち上がりません。
Detach Threshold=50 他のオブジェクトにぶつけた時に落としやすい。「Detach Threshold=50」の上に「Detach Threshold=3000」を重ねると持ち上がりません。
Detach Threshold=3000 他のオブジェクトにぶつけても結構がんばるスゴイ奴です。「Detach Threshold=3000」の上に「Detach Threshold=50」を重ねても持ち上がります。
ケロリン 投げて遊んでください。Throw Multiplierは「2」にして、若干跳ねるようMaterialを設定しています。

f:id:takoyakiroom:20161015154208j:plain

トラックパッドで移動できるようにしています。
移動のさせ方は以下の記事を参考にしてください。
takoyakiroom.hatenablog.com

コントローラに表示されているツールチップについては、こちら!
takoyakiroom.hatenablog.com