【Unity】Pico Neo 3 VRアプリ開発 (2) ～ XR Interactions Toolkitを動かす ～

# はじめに
Pico Neo 3のSDKはUnity XR Pluginに準拠しているので、XR プラグインフレームワークに則ったUnityProjectを対応させる事ができます。
この記事では、XR Interactions ToolkitのサンプルをPico Neo 3で動作させる方法を説明します。

* 前回の記事
[【Unity】Pico Neo 3 VRアプリ開発 (1)](https://qiita.com/afjk/items/d524148be70211510d75)

## XR Interactions Toolkitについて
* Unity入力イベントから3DオブジェクトやUIとのインタラクションを可能にするフレームワークです。
* VRコントローラーでRayを飛ばしてGameObjectをGrabしたりuGUIのボタンやチェックボックスなどを操作したりといったインタラクションを実現できます。
https://docs.unity3d.com/Packages/com.unity.xr.interaction.toolkit@0.9/manual/index.html
* こちらの動画を見れば出来る事は大体イメージ出来ると思います。

https://twitter.com/afjk01/status/1527678589193244672?s=20&t=Cme7pzKiAmHRbJsKaiqLqQ

# XR Interactions Toolkitのサンプルを入手する
* まず、XR Interactions ToolkitのサンプルプロジェクトをGitHubから入手します。
https://github.com/Unity-Technologies/XR-Interaction-Toolkit-Examples
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/a071f947-4bed-0e03-bbfc-5eb1058c681a.png)

* Unityプロジェクトになっているので、VRのプロジェクトをUnityで開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/fd9f35f3-edbf-e306-bfcd-bc7233e6ce94.png)
* プロジェクトはUnity 2019.4.22f1ですが、今回はUnity2022.3.0f1で開きます。
* URPのバージョンが古いとの警告。自動でアップグレードしてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/386ed6c6-5004-6ee9-0ca6-0a9110f5754d.png)
* [前回の記事](https://qiita.com/afjk/items/d524148be70211510d75)を参考に、Pico Unity XR SDKをUnityプロジェクトに取り込み、Unityプロジェクトの設定を行ってください。

# サンプルプロジェクトを動かす
* 「World Interaction Demo」シーンを開いてみましょう。
    * Assets > Senes > WorldInteractionDemo を選んでください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/72ac9bfc-474e-6a89-334c-7ffb55452c1b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/dbf33798-715f-00ea-4992-0f9040c6ec2a.png)

# ビルドする
* ビルドすると以下のエラーが出ます。メッセージの通り、Color SpaceをLinearに変更します。
```BuildFailedException: Only Linear Color Space is supported when using OpenGLES. Please set Color Space to Linear in Player Settings, or switch to Vulkan.```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/d16a7dd6-4507-ca8a-8eef-131e0609f29d.png)
* また、LinearではOpenGLES2は対応していないのでリストから削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/80fb0d2b-cb17-6e28-96e5-a1162a3c6f07.png)

* ビルドしてPico Neo 3 Proで動作確認する
  動きました。簡単ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/4216794f-5f00-093d-5af2-879764e7c100.png)

以下、気になる点を調整します

## カメラの高さを調整する
* サンプルシーンはデフォルトのままだと床から高い位置にカメラが置かれます。
    * CameraOffsetのPosition.Yを0にしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/d89731ee-84b6-db16-3996-247971f05620.png)

## コントローラーモデルを変更する
* [前回の記事](https://qiita.com/afjk/items/d524148be70211510d75)同様、PicoのControllerModelを左右のコントローラーのXR ControllerのModel Prefabにセットします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/4ffd0a84-dc33-b192-9d90-8feef518cc85.png)
* なお、PicoのコントローラーモデルのマテリアルはURPに対応していないので調整が必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/ae64f0c0-08ff-d802-63ac-fcebf1a0517c.png)

* Controller5のShaderをUnlit/Textureに変更してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/35601170-59fa-f33a-105a-bc742b7fda84.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/1204ccca-0656-2f12-6075-9d1fa2ceb4c6.png)
良い感じになりました。

## Pico Neo 3で動かしてみた感想
ほとんどの機能(Grab/Teleport/スムーズ移動/uGUI操作)は問題なく動作します。
* 気になった点
    * Grabしたオブジェクトを離すと吹っ飛びがち
    * InputFieldへの入力は出来ない
        * Androidのシステムキーボードが表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/bb1db3f7-a70e-0ebc-97e7-6783c8672c29.png)
    * Androidのキーボードが立ち上がらないようにする方法は公式で説明されています。
        * 無効にした上でVR用のキーボードを組み込むと良いでしょう。
https://developer.pico-interactive.com/docs/en/12058/231324/


# ハマった点
* uGUIがクリック出来ない？
    * 最初uGUIの操作が出来ず、原因が分からなかったのですが、Pico Neo 3のLab設定で120Hzリフレッシュモードを有効にしていたのが影響していたようです。
120Hzリフレッシュモードをオフにすると問題なくuGUIを操作できました。

# おわりに
Pico Neo 3でUnity XR Interactions Toolkitが問題なく動作する事が分かりました。
他のVRデバイスと共通のプロジェクトを大きな変更なくPico Neo 3でも動作させられるのは良いですね。

次回はPico独自の機能について紹介したいと思います。
* [【Unity】Pico Neo 3 VRアプリ開発 (3) ～ Pico Neo 3の独自機能紹介 ～](https://qiita.com/afjk/items/0b6f8c7206e2f2aeddab)