Unity+VIVE Wave SDKでのVIVE Focus Plus用シーンのセットアップの基礎

# はじめに

VIVE Focus Plusでアプリを作るには、[VIVE Wave SDK](https://developer.vive.com/resources/knowledgebase/wave-sdk/)を用います。Unity用のSDKもあり、その中のサンプルシーンを見たり、[ドキュメント](https://hub.vive.com/storage/docs/en-us/UnitySdk.html)を見ることで一応基本的な使い方はわかりますが、ビミョーにわかりづらいので、基本的なところをメモとして残しておきます。始める前に、Unityプロジェクトを新しく作って、Wave SDKのUnityPackageをインポートしておいてください。

# 環境設定
[公式ページ](https://hub.vive.com/storage/docs/en-us/UnityPluginGettingStart.html)を参考にセットアップしてください。Unity2019を使っていて、ターゲットとなるAPIレベルが使えなくてビルド時にエラーが出る場合は、管理者権限でコマンドプロンプトを開いて、`...\Hub\Editor\2019.3.0a11\Editor\Data\PlaybackEngines\AndroidPlayer\SDK\tools\bin`（Unity2019.3.0a11の場合）へ移動して、`sdkmanager "platforms;android-25"`というふうに必要なパッケージをインストールしてください。

ビルドについては、Vive Wave SDKがおすすめしてくる設定で良いのですが、**Graphics APIsの最初がVulkanではなくOpenGLES3であることを確認してください**。Vulkanが最初だとアプリが動作しません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/6516b0af-c509-4f5d-d3cc-451f66e03b5d.png)

# カメラの設定
シーン内のMain Cameraは削除して、代わりにAssets/WaveVR/Prefabsの"WaveVR"プレハブをヒエラルキーにドラッグ＆ドロップしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/bdf91814-422e-4004-7cee-36b155d387a9.png)

# コントローラーの設定

ControllerLoaderプレハブをヒエラルキーにドラッグ＆ドロップしてください。両手を使うなら、2つ用意する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/5b9661f2-050b-ff66-ac5e-922d903cc72a.png)

ここで、Vive Wave独特の"dominant hand"という概念に注意してください（くわしくは[こちら](https://hub.vive.com/storage/app/doc/en-us/WaveVR_Controller.html))。これは「主に使う手」という意味で、Right hand modeの場合は右手、Left hand modeの場合は左手がdominant handになります。dominantでない方はnon dominantとなります。ControllerLoaderのWaveVR_ControllerLoaderコンポーネントの"Type"の設定が、コントローラーの一つで"dominant", もう一つで"non dominant"になる必要がありますので注意してください。

また、Adaptive loadingにチェックが入っている場合、実行時にWaveVR_ControllerLoaderによってAdaptiveControllerプレハブがインスタンス化されます。WaveVR_ControllerLoaderそのものがコントローラになるわけではないので注意してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/d4c5097f-e805-490a-d7bc-128157dbfe80.png)

# ボタン入力

Vive Wave SDKには**WaveVRButtons**というプレハブがあり、その中のWaveVR_ButtonListコンポーネントによってボタン入力に関する設定ができます。**これが無いとボタン入力ができない**ので注意してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/af718470-2adf-ef60-4446-8e06b1f192e2.png)

この中のButtonsのリストの内容を変えることによって、使うボタンを指定できます。アプリで使わないボタンは動作しないようにできるので便利ですね。

スクリプトの中では、`WaveVR_Controller.Input(device)`によってdeviceで指定されたデバイスの状態を見ることができます。deviceには`WaveVR_Controller.EDeviceType.Dominant`のようにWaveVR_Controller.EDeviceType型を使ってdominant/non dominantで指定するか、WVR_DeviceTypeを使ってRight/Leftで指定するかができます。

そして、`WaveVR_Controller.Input(WaveVR_Controller.EDeviceType.Dominant).GetPress(WaveVR_ButtonList.EButtons.Trigger)`のようにGetPress, GetPressDown, GetPressUpなどのメソッドにbuttonIDを与えることで入力の状態を見ることができます。buttonIDはWaveVR_ButtonList.EButtons型で指定できます。



# GUI

VR内でコントーラーからのビーム＋ポインターを使ってボタンを押す場合は、ヒエラルキーにInputModuleManagerプレハブを加え、CanvasにはWaveVR_AddEventSystemGUIコンポーネントを追加します。このとき、**ボタン一つ一つに対して別々に親となるCanvasを作るようにしてください。** 言い換えれば、一つのCanvasの直下に複数のボタンがある状態だと上手く動作しません。ボタンそれぞれに、そのボタンだけと対応するCanvasを用意してください。

トリガーなどのボタン入力はWaveVRButtonsプレハブを追加することで処理できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/b2f561cc-d832-bcb7-1e6e-14fa7a59ddf9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/4bc8a1cf-df90-458c-4aa3-2ac861ca33b7.png)

レーザーポインターには Fixed Beam Mode, Flexible Beam Modeがあり、Fixedの場合レーザーの長さは固定ですが、Flexibleの場合は、ボタンとの距離に応じて長さが変わります。見やすいのは後者なのでお薦めです。この変更はInputModuleManagerの中で行います。Override System Settingsにチェックを入れ、Raycast ModeをBeamにしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/7b13b1ff-01c8-a803-4abf-edd644e564d6.png)

# おわりに

これだけあれば、基本的なことはOKだと思いますが、公式サンプルには他にも色々便利な機能が紹介されてるので、併せてご覧ください。