【KAT loco S × Oculus Quest2】足踏みで移動するVRの作り方

# 歩行型センサーに対応したVRアプリ開発

VRにおけるロコモーションの工夫には様々なパターンがあり、世界中で検証が重ねられています。
OculusQuest2のみを使用したロコモーションについては、下記のアイデアが大変参考になりました。
- [Oculus、VRでの移動に関する8つのアイデアを公開](https://www.moguravr.com/oculus-rift-vr/)
<br>

特殊なデバイスを使うアイデアとしては、歩行やサイクリング等が知られています。
今回はVR歩行デバイスの中で特に選ばれている **KAT VR** さんの **KAT loco S** を入手し Unityでの対応アプリ開発の経験をしたので、備忘録を残します。
![IMG_4241.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666148/f14ce140-04ae-7add-b2d6-6130f9107e56.jpeg)



### 環境
Windows 11
Unity 2021.3.8f1
SteamVR Unityプラグイン v2.7.3(sdk 1.14.15)
KAT Loco&Walk C Unityプラグイン V1.0a
Oculus Quest 2


### 筆者について
Unity・プログラミング1年目。
正確な情報の発信を心がけておりますが 経験が浅い為、お気付きの点などございましたらお声掛け頂けますと幸いです。


# KAT loco S 基本情報
小型で安価な**家庭用歩行型VRセンサー**。 KAT VR さんのデバイスの中で最も手軽な歩行型VRコントローラーです。
腰と両足にセンサーを取り付け、その場で足踏みをすることでVR空間上でも前進することができます。
頭と体の向きは独立させて操作でき、簡易的なモーションキャプチャ機能もあります。
現時点では ¥44,000～、KAT VR日本代理店にて購入できます。


Oculus Quest2 でプレイする場合、**Oculus Link** を使って **SteamVR** を起動し、**KAT Gateway** という専用ソフトウェアでロコモーションの制御を行います。
酔い防止と没入感の向上が望めますが、正確に止まりたい場所で止まることは苦手なようです。
細かい動きが必要とされる場面よりも、自由に散策するような場面が向いていると思われます。(VRChat用に購入する方が多い印象)

https://katvr.jp/product_katloco_s.php


# 開発に必要なもの
今回は KAT loco S の初期設定が済んでいる前提で進みます。
新規プロジェクトでも既にあるプロジェクトでも、現時点では同様の手順で対応できます。

## KAT Loco&Walk C プラグイン
KAT VR公式より、Unity と Unreal Engine に向けた２種類のプラグインが用意されています。
基本的に公開されておらず、サポートページから開発キットのURLをその都度問い合わせる必要があるようです。
同一のプラグインで `KAT WALK C` への対応も出来ます。

https://katvr.jp/developer.php

## SteamVR Unity プラグイン
Unity のアセットストアにて無料公開されています。

https://assetstore.unity.com/packages/tools/integration/steamvr-plugin-32647


# 環境の準備
### SteamVR プラグインの導入
1. プロジェクトにSteamVRプラグインをインポート。
2. OpenVR設定がまだの場合は OpenVR Unity XR Installer が表示されるので、Okをクリック。
![スクリーンショット (102).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666148/e134e9a5-6c69-1b52-310e-72e4d3a58242.png)
3. SteamVR推奨の設定が表示されるので、Accept All をクリックして設定変更。
![スクリーンショット (105).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666148/5efd26bf-f311-c499-8726-0feb9ecbd154.png)

### KAT Loco&Walk C プラグインの導入

1. 問い合わせフォームよりプラグインを入手し、ダウンロード・解凍。
2. Accessory に含まれる ToSystem32 の中身を更新するように とのガイドMovie があるので、それに従う。(中国語と英語なので戸惑うが、見たまま手を動かせばOK)


1. Pluginフォルダ内に、`WalkerBase_2C-20211014.unitypackage` と書かれた `GZファイル` が入っている。一般的な Unity Package とはインポートの仕方が異なる。
1. Project ビューで右クリックし、 Import Package > Custom Package を開く。



4. 画像を参考に、右下の**ファイルの種類の選択**を**All files**に変更するとインポート画面に進める。
![スクリーンショット (107).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666148/eca9307d-7c47-c12c-956d-44a288bb5447.png)

5. パッケージ内に古い SteamVR プラグインが含まれており、そのままインポートすると動かなくなるので注意。SteamVR のチェックを外してインポートする。
![スクリーンショット (108).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666148/89d44b86-1f42-fb7e-e212-80ea32190d52.png)

# KAT Gateway の設定
ここからは、実際に起動して作業を進めます。
KAT loco S を装着、Oculus Link から SteamVR を起動、KAT Gateway も起動させます。

Guideフォルダ内のドキュメントを参考に KAT Gateway を設定するのですが、資料が古かったので現時点での最新版スクショを添付します。
私が開発した際は、下記画像のように設定しました。
![スクリーンショット (109).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666148/ff0b5fec-7a02-d1b3-7abe-b4b8153b5d78.png)

基本設定については詳しく解説してくださっているYoutuberさんなどが複数いらっしゃったので、簡潔にまとめます。
Steam に公開されているゲームを遊ぶ場合とは設定が異なるので、上記画像と下記をもとにお好みで設定してください。

### コントローラーオプションの設定項目
- Mapping Speed
　歩く速さの感度が設定できます。
- Walking Trigger Sensitivity
　動き出すトリガーの敏感さを調整できます。
- Lateral Movement
　横移動のON・OFF、その感度を調整できます。
- Backward Movement
　後ろ移動のON・OFF、その感度を調整できます。
- Cruise Movement
　自動で前進し続けるクルーズモードのON・OFF、その感度を調整できます。
- Independent head and body direction
　ONにすると、頭と腰のRotationを別で動かせます。

### モードの種類
- InSteam
　SteamVR 上での移動を KAT loso S に置き換えます。
　開発の際はマッピングモードを Custom に設定します。
- Keybord
  　キーボードのWASDで操作する移動を KAt loco S に置き換えます。
- Xinput
　 Xbox コントローラーのようにゲームパッドで操作する移動を KAT loco S に置き換えます。
- MoCap
　 モーションキャプチャ機能による簡易的なトラッキングモードが使用できます。
![スクリーンショット (110).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666148/c688812c-e12f-be8e-51c1-30df0302aac3.png)


# 歩行の確認
Oculus Link から SteamVR を起動し、歩行の確認をします。
1. KATVR SDK > Prefabs にある `KAT_Player` をシーン上に配置します。
1. KAT_Player には SteamVR の `[CameraRig]` Prefabが含まれていますが、古いScriptが付いておりそのままでは使えません。
元々含まれている [CameraRig] を削除し、SteamVR > Prefabs にある新しい [CameraRig] を KAT_Player の子に配置します。
3. 削除したので、KAT_Body の KAT Device スクリプトのカメラがMissingになります。画像を参考に、新しいカメラを設定して下さい。
![スクリーンショット (111).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666148/ee4acdd4-78f3-bc5e-9977-3477a71bf5d6.png)

以上の設定で、ひとまず歩けるようになるはずです。
しかし歩けるだけでコントローラーも表示されず、何も操作ができません。
ここからは SteamVR の設定をしていきます。

# SteamVR への対応
筆者は SteamVR 開発が初めてのため下記記事を参考に手探りで進めており、回りくどい設計になっている可能性があります。
ここまでの情報は他では見つからないものを含みましたが、以降は他記事を併せてご覧下さい。

### 大変参考にさせて頂きました
下記２つの記事を参考にさせて頂き、基本的な入力処理の実装ができました。

https://framesynthesis.jp/tech/unity/htcvive/

https://hackmd.io/@Motoki/SkclZ-z2w

下記記事を参考にさせて頂き、掴む処理の実装ができました。

https://takoyakiroom.hatenablog.com/entry/2020/09/15/182028

他にも SteamVR > InteractionSystem > Samples 内のシーンで様々な機能が試せるので、そのスクリプトを参考にすると大抵のことは出来るようになります。

<br>

# SteamVR の Player Prefab と KAT_Player を合体させる
SteamVR と KATプラグインを組み合わせて動かす情報が他に見つからなかった為、続けて記録を残します。
SteamVR の Player Prefab には一通りの機能が揃っているため、そこに KAT_Player の機能を組み込むことにします。

<br>

2. 空の GameObject を作ります。名前は KATloco_Player としました。
2. 先程の KATloco_Player に、CapselCollider と Rigidbody を Add Component します。
2. CapselCollider のMterialに **KAT_PlayerMaterial** を設定します。
2. Rigidbody の Constraints > FreezeRotation に全てチェックを入れます。

1. SteamVR の Player Prefab を検索し、KATloco_Player の子として配置します。
![スクリーンショット (112).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666148/cfb8f590-e919-62a6-7b82-40958996edcb.png)
![スクリーンショット (114).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666148/c57c959d-95e3-5c68-e09f-33fefe8ab7a7.png)
6. Player に KAT Device を Add Componentし、下記画像のように設定します。
![スクリーンショット (117).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666148/0a917487-a959-1e54-bd18-927291bcd9a3.jpeg)

7. 先程の記事を参考に、コントローラーの入力を実装します。



<br>

以上で、手の操作が出来るようになります。
お疲れ様でした。