VIVE Focus 3 アプリの制作
HTC VIVE/VIVE proのPC-VRアプリ開発にはSteamVR Pluginを使用するが、HTC VIVE Focus 3をVIVE Business Streamingを使ってPC-VRを行う場合には、SteamVRで開発したアプリがそのまま動く。
HTC VIVE Focus 3 本体で動かすには、Android用SDKのWAVEを使う。
VIVE WAVE とVive Input Utility
VIVE WAVEはAndroid向けVR機能を、Qualcomm Snapdragonに最適化して提供している。
AndroidデバイスでVRを行う最もシンプルな構成として、眼前に固定したスマホのLandscape方向スクリーンへステレオ画像を表示する形で、
内蔵センサーでヘッド回転方向を3DoFで取得してVR空間内でカメラ回転し画像に反映させる形に対応。
スマホはハンド入力用外部コントローラーがないので、画面内でAimにポインターを一定時間合わせると選択される
インターフェースで対応できる。
追加の外部コントローラーに対してはクリッカーと呼ばれる選択ボタン1個のものから、複数ボタンが付いたもの、
さらにはアナログ入力やトリガーキー、グリップキーなど手指に応じたボタンを備えるものがある。
VR専用機のAndroidデバイスは周辺カメラで周囲を撮影してヘッド位置を6Dofでトラッキングできるものが登場。
視界にとらえたコントローラ位置を6Dofでトラッキングし、素手のジェスチャーもトラッキングできるようになった。
HTC VIVE Focus 3 やOculus Quest 2のようにヘッドもハンドコントローラーも6Dofトラッキングとなると、
VRアプリはPC-VRと同じ構成で組み立てられる。
Oculusの場合はOculus Integrationという一つのSDKでPC-VRとAndroid-VRが統合されており、
アプリを共通化してUnityでビルドする時にターゲットプラットフォームを切り替えるだけで済む。
しかしVIVE Focus 3の場合には、スタンドアロンはVIVE WAVEで、PC-VRはValve Corporationが提供するSteamVR Pluginで別々に開発しなければならない。
VIVEが提供しているVive Input Utilityを使えば、PC-VRとAndroid-VRのプログラムを共通化できるはずなのだが。
VIVE Input Utilityを使うと、SteamVR がインストールされた状態でAndroidにプラットフォームを切り替えるとコンパイルエラーが出るという不具合があった。
この不具合は2022年1月に出たv1.14.2で解消され、VIVE Input Utilityと一緒にVIVE proなどOpenVR
デバイス向けのSteamVR Pluginも入れ、さらにAndroidVRのVIVE WAVEも同時に入れて
Unityでビルドプラットフォーム変更で共用できそう。
以下は、VIVE Input Utilityを使わないで実行した。
VIVE WAVEのプロジェクトセッティング
新規プロジェクトを作成
Androidビルドサポートを追加したUnityEditorで、3Dテンプレートで新規作成する。
後々エフェクトなどを使うにはURPがよいが、まずはビルドインレンダラーの3Dテンプレートで始める。
VIVEレジストリを追加
UnityAssetsStoreで"VIVE REGISTRY"を検索し、プロジェクトにインポートする。
レジストリを追加する方法としては
- Jsonファイルに記載追加する。
- Project Setting>Package Managerに記入する。
- vive-registry-tool-v1.1.1.unitypackageをインポートする。
- UnityAssetsStoreから"VIVE Registry Tool"をインポートする。
の4つのどれでもできるが、registry toolを使うのが一番簡単。


結果、Project Setting>Package Managerでレジストリ追加が確認できる。
レジストリが反映されていなときは、もう一度"VIVE REGISTRY"をインポートする。

VIVE パッケージのインポート
Package ManagerでMyRegistryを開く。
リストが表示されない場合は下端にあるリフレッシュボタンを押す。

- VIVE Wave XR Plugin をインポートする。
- VIVE Wave XR Plugin - Essenceをインポートする。
- VIVE Wave XR Plugin - Nativeもインポートされる。
- VIVE Input Utilityをインポートする。(Focus3コントローラーモデルがある)
Project Setting
プラットフォームをAndroidに変更する。
WAVEウィザードが開いて下記の諸設定を行ってくれるので、Applyするだけでよい。
- Project Setting>Player> Resolution and Presentation
Default Orientationを、"Landscape Left"にする。
- Project Setting>Player> Other Settings
グラフィックスAPIsの設定で、Vulkenがあれば「-」を押して削除する。
- Minimum API Levelを25以上にする。
- Target API Level をAndroid 10.0 (API level 29)にする。
Project Setting>XR Plug-in Managementの設定で、WaveXRを選ぶ。

Sampleシーンを追加
Package ManagerでVIVE Input UtilityのSampleから6.Controller Manager Sampleを選びインポートする。
一度に入れると、それぞれにある同じC#スクリプトファイルが重複してエラーになるので注意する。

Focus3にビルド
6.Controller Manager Sampleの、ControllerManagerSampleシーンを開く。

InteractionModeManagerは無効化する。
Build SettingsでScenes In Buildリストにシーンを追加する。
VIVE Focus3の開発者モード(USBデバックをON)にして、USBケーブルでつなぐ。
接続モードは、VIVE Business Streamingではなく、File転送を選ぶ。
Build SettingsでRun DeviceをRefreshして、表示されたVIVE Focus3を選択する。

Build And Runを押し、アプリファイル名を指定して実行されるのを待つ。
アプリ転送が終わると、VIVE Focus3で起動するので、ヘッドセットを付けて動作を確認する。
Unity Starter Assets に6.Controller Manager Sampleを入れる
Unity Assets Storeから、Unity Starter Assetsをインポートして、Playgroundシーンを読み込む。
ヒエラルキーで、プレイヤー、カメラ関係のゲームオブジェクトを無効にする。
アセットから、ヒエラルキーに、ControllerManagerSampleシーンをドロップし、ゲームオブジェクトを
Playgroundシーンへ移動する。
ヒエラルキーのControllerManagerSampleシーン>Environment>Roomは削除。Directional Lightも削除。
ヒエラルキーのControllerManagerSampleシーンをリムーブ(シーンをセーブしない)する。
InteractionModeManagerは無効化する。
ヒエラルキーのEnvironment>Greyboxの下にある床面に成るオブジェクトに、Teleportable.csをAddComportnentする。

Build SettingsでScenes In Buildリストにシーンを追加する。
VIVE Focus3の開発者モード(USBデバックをON)にして、USBケーブルでつなぐ。
接続モードは、VIVE Business Streamingではなく、File転送を選ぶ。
Build SettingsでRun DeviceをRefreshして、表示されたVIVE Focus3を選択する。
Build And Runを押し、アプリファイル名を指定して実行されるのを待つ。
アプリ転送が終わると、VIVE Focus3で起動するので、ヘッドセットを付けて動作を確認する。
スナップターンが無いが、シーン内でウォークスルーできる。