Unity+Vive+VRTKを使ってタワーを登ってみた

Unity と HTC ViveとVRTKを使ってタワーを登るサンプルです。

#環境
- [Unity5.6.0](http://japan.unity3d.com/)
- [HTC Vive](https://www.vive.com/jp/)
- [SteamVR 1.2.1](https://www.assetstore.unity3d.com/jp/#!/content/32647)
- [VRTK 3.1.0](https://www.assetstore.unity3d.com/jp/#!/content/64131)

#SteamVRとVRTKをインポート
[SteamVR](https://www.assetstore.unity3d.com/jp/#!/content/32647)と[VRTK](https://www.assetstore.unity3d.com/jp/#!/content/64131)をAsset Storeからインポートしてきます。

![s100.gif](https://qiita-image-store.s3.amazonaws.com/0/154355/c121f887-5989-2812-7b32-333db7b0d82f.gif)

#CameraRigを設置する
SteamVR
└Prefabs
　└[CameraRig]を設置します

既にある`Main Camera`は削除しておきましょう。

![s101.gif](https://qiita-image-store.s3.amazonaws.com/0/154355/17140f19-f32a-f927-4871-fdc36554c6fd.gif)

#VRTKを設置する
Hierarchyビューで右クリックして、Create EmptyでVRTKという名前を作成します。
その後、VRTKの`VRTK_SDKManager`をアタッチしていきます。
VRTK
└Scripts
　└Utilities
　　└VRTK_SDKManager

InspectorビューのVRTK_SDK ManagerのSDK Selection部分を`Steam VR`を選択しましょう。
`Auto Populate Linked Objects`ボタンをクリックすると自動的に値がセットされます。

![s102.gif](https://qiita-image-store.s3.amazonaws.com/0/154355/351b26a1-b063-2b2b-994a-ac60bfe89dd6.gif)

#Unity5.6対応
Unity5.6だとコントローラーの認識に不具合があります。
その為の対策を施しておきます。
[Camera Rig]
　└Camera (head)
　　└Camera (eye)

Camera (eye)に対して`Steam VR_Update Poses`のスクリプトを適応しておきます。

![s103.gif](https://qiita-image-store.s3.amazonaws.com/0/154355/387caca0-174d-bab0-f8ab-44e965b0f968.gif)

#コントローラーオブジェクトと移動用オブジェクト作成
VRTKに空のオブジェクトを作成して、左右コントローラー用と移動用のオブジェクトを作成しましょう

![s104.gif](https://qiita-image-store.s3.amazonaws.com/0/154355/32bb9b48-46a5-e07d-8d90-6c21fc13593b.gif)

その後、左右コントローラーにスクリプトを適用します。
・VRTK_ControllerEvents
　VRTK-Scripts-Interactions-VRTK_ControllerEvents

・VRTK_Pointer
　VRTK-Scripts-Pointers-VRTK_Pointer

・VRTK_StraightPointerRenderer
　VRTK-Scripts-Pointers-PointerRenderers-VRTK_StraightPointerRenderer

移動用オブジェクトにVRTK_BasicTeleportを適用します。
・VRTK_BasicTeleport
　VRTK-Scripts-Locomotion-VRTK_BasicTeleport

![s105.gif](https://qiita-image-store.s3.amazonaws.com/0/154355/d4cb3bb8-1ffb-c4fa-5898-b0211bf87e00.gif)

#オブジェクトを適用していく
作成したLeftとRightオブジェクトに移動用ポインターのオブジェクトがどれなのかを設定します。
VRTKのSDK Managerにも左右コントローラーを登録します
![s106.gif](https://qiita-image-store.s3.amazonaws.com/0/154355/378fac00-195c-8ada-875f-0d83132106b3.gif)

#床を設置する
3Dオブジェクトを追加して、床を設置しましょう。
床の色も変更しています。

![s107.gif](https://qiita-image-store.s3.amazonaws.com/0/154355/2762222c-5f23-7169-4fca-f28dcbd802b3.gif)

#実行確認
ここまで出来れば一度実行してみましょう。
コントローラーが認識され、コントローラートラックパッドをクリックすると
移動用ポインターが表示されて、離すとそのポイントへ移動します。

![s108.gif](https://qiita-image-store.s3.amazonaws.com/0/154355/8373d9ac-50f1-6d6d-88f3-fab95b275d65.gif)

#コントローラーに掴む機能を追加する
LeftとRightオブジェクトに`VRTK_InteractGrab`を適用します。
VRTK-Scripts-Interactions-VRTK_InteractGrab

掴むボタンはコントローラーの側面にあるグラブボタンです。
トリガーを引いてしまいますが、デフォルトは側面のボタンなので注意が必要です。

![s109.gif](https://qiita-image-store.s3.amazonaws.com/0/154355/5254ad53-86c7-c602-7a0d-b52da0bae8f0.gif)

#登るためのタワーを設置する
今回は無料の[タワー](https://www.assetstore.unity3d.com/jp/#!/content/2299)を使います。

![s110.gif](https://qiita-image-store.s3.amazonaws.com/0/154355/a98629e2-b37a-fb46-8553-aa28d858eac4.gif)

#SAColliderBuilderを適用する
Unity5ではMeshのColliderに対応していないため、
無料のアセットを使って対応するようにします。

今回はこれを使って対応します。
これを使うといい感じにColliderを作成してくれます。
[SAColliderBuilder](https://www.assetstore.unity3d.com/jp/#!/content/15058)

あとは、コントローラーに登るスクリプトを適用すると、
タワーに登れるようになります。

![s111.gif](https://qiita-image-store.s3.amazonaws.com/0/154355/b7f7571b-d0d3-f283-97ef-8a99701e4b9d.gif)

#まとめ
VRTKを使うとわずか30分もかからずに実装することが出来ました。
とても便利なアセットですね。