[Vision Pro] Poly SpatialでのVision Proアプリ開発 1.3.9版 [Unity]

これは [STYLY Advent Calendar 2023](https://qiita.com/advent-calendar/2023/styly) の10日目の記事です。

### はじめに
UnityでApple Visio Pro向けのアプリ開発を始めるための情報をまとめました。

本記事は2024/08/05現在の内容になります。

### Unity公式情報

https://unity.com/ja/campaign/spatial

https://docs.unity3d.com/Packages/com.unity.polyspatial.visionos@1.3/manual/index.html

開発者フォーラム

https://discussions.unity.com/tag/visionos

 
### 開発環境
* Apple Sillicon Mac (Windows、Intel Macは非対応)
* Xcode 15.3以上　
* Unity 2022.3.19f1以上 
* Unityライセンス Pro/ Enterprise / Industry
  * 無料のPersonalライセンスでは利用出来ません

### アプリの形式
* Bounded：境界あり
  * 他のアプリとの共存が可能
* Unbounded：境界なし
  * 排他モードで他のアプリとは共存出来ない
  * 頭の位置や、ハンドトラッキング、画像マーカー認識などを利用できる

その他、windowモードや完全没入のVRモードがあります。

### テンプレートプロジェクト
必要な設定がまるっと入ったプロジェクトです。
packageの組み込みやプロジェクト設定済みなのですぐに開発を始められます。

BoudedとUnboundedのシンプルなシーンがあります。


Google Driveで配布されているので、最新バージョンのzipファイルを入手してください。

https://drive.google.com/drive/folders/1Oe-6bBCCmk7okbK832HWiYFbM8mV0XrZ
説明はこちら。

https://docs.unity3d.com/Packages/com.unity.polyspatial.visionos@1.3/manual/TutorialCreateFromTemplate.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/7322ccb3-9a5e-5e43-cc30-a30da4f8c4b5.png)

### サンプルシーン
PolySpatialの機能を一通り体験出来るサンプルがあります。
インストールはPackageManagerから行います。
PackageManager > PolySpatial > SamplesタブにSampleがあるのでImportしてください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/7c2f13b8-25ce-e043-9e76-68ada74b2921.png)

Build SettingsでProjectLauncherを先頭にして登録すると、ランチャーから表示されるので良い感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/f694d3ae-b467-677d-2205-58584ab4c4a0.png)

ドキュメントはこちら。

https://docs.unity3d.com/Packages/com.unity.polyspatial.visionos@1.3/manual/Samples.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/86721f7f-d4c9-31f0-1e1a-3cfbca149b3d.png)

* Project Launcher
* Targeted Input - Balloon Gallery
* uGUI
* Input Debug
* Object Manipulation
* Character Navigation
* Mixed Reality （実機のみ）
* Image Tracking (実機のみ）
* Swift UI (シミュレーター or 実機）
* Meshing (実機のみ）
* Portal

### Play to Device
UnityEditorから直接Vision OSシミュレーターまたはVision Proの実機で動作を確認出来る機能です。
シミュレーターの場合はアプリを、実機の場合はTestFlightで配布されたアプリを利用します。
試したところ、Play中にGameObjectを追加したりしても反映されました。すごいですね。
毎回UnityからXcodeへビルド→Xcodeプロジェクトをビルドして確認するという手間をスキップ出来るので開発効率が上がります。
注意点として、ホストアプリのバージョンとUnityのPolySpatialのバージョンは合わせる必要があります。
https://discussions.unity.com/t/play-to-device/309359

### ゼロからプロジェクトを作るには
公式マニュアル

https://docs.unity3d.com/Packages/com.unity.polyspatial.visionos@1.3/manual/TutorialCreateFromScratch.html#mixed-reality-and-shared-space

１\. Unity2022.3.19f1以降でプロジェクトを新規作成します。 テンプレートはUniversal 3Dを利用すると良いでしょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/3476ea60-30ea-7691-4f9f-4932ca510c39.png)

2\. Project Settings > XR Plugin ManagementからInstall Plugin Managementを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/6bfc2ede-28b3-1c3b-d8c1-2c0c93225796.png)

3\. Apple visionOS にチェック
`Apple visionOSのチェックが表示されない場合、XR Plugin Managementが 4.4.1 以上になっていることを確認してください。`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/8c6cc818-4f16-211a-b7ff-bd0037af8c54.png)

new input system有効のためのダイアログが表示されたらYesを選択。Unity Editorが再起動されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/1d0fb1b9-793c-cd8d-73e0-e1d6cf38a821.png)

4\. XR Plugin Management > Apple visionOSでApp ModeをMixed Reality - Volume or Immersive Spaceを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/364135b4-0e69-4ac3-acf2-dad952da28b6.png)


Install Poly Spatialダイアログが表示されたらYesを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/de0699fd-53ba-75c0-f060-3b4b2203e213.png)

Hand Tracking とWorld Sensingを使用する場合のユーザーへの説明を必要に応じて入力。
Store審査に提出する際には必要になります。Hand Trackingは必須の様です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/8f8d9087-45ba-f47f-1f77-3b34ad1bea61.png)

5\. VolumeCameraを作成

Hierarcyで右クリックメニュー XR > Setup > VolumeCameraを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/8bb7ce17-31d1-7e8b-0ebf-39610013edc7.png)

6\. Volume Camera Window Configrationアセットを作成

ProjectのResourcesフォルダで右クリック Create > PolySpatial > Volume Camera Window Configration
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/f514a672-a094-aefd-16cf-82996c1c5aae.png)

Bounded or Unboundedを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/c261cc7f-dac0-798f-37c9-61c91418c3ad.png)

Volume Cameraにセットする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/8279999b-a60d-8add-7dd1-c50262455637.png)

これにより、アプリが共有スペースで表示するBoundedなのか、フルスペースを利用するUnboundedなのかが設定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/edd8a456-6b57-cb5e-ddac-d0f93899e6ae.png)

Boundedにする場合はオブジェクトがVolumeCameraからはみ出ない様に注意しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/0bd442c8-1b38-8d35-016e-7fa42ef09f6e.png)

* ビルドの際はTarget(Simulator or Device)に注意

Build Settingsでビルド前に指定します。
シミュレーターで試す場合は`Simulator SDK`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/2e37463c-e0d4-5ffb-07da-7851f97d553a.png)

ビルドするとXcodeのプロジェクトが生成されるので、Xcodeで開いて実行してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/d940f11f-475c-df3b-f8d9-6ae5e0e020fe.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/e614a890-090f-ef83-c5b9-4eaf4ecaedad.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/c2e8d5c7-3638-9988-49f1-9a01f5251a95.png)

### 各種機能のサポート状況
Unityの全ての機能が使えるわけではなく、特に描画に関してはReality Kitに変換される事もあり制限があります。
機能のサポート状況は以下で確認できます。

* サポートしている機能、コンポーネントの一覧表

https://docs.unity3d.com/Packages/com.unity.polyspatial.visionos@1.3/manual/SupportedFeatures.html


https://docs.unity3d.com/Packages/com.unity.polyspatial.visionos@1.3/manual/Assets.html

* visionOS でのマテリアルとシェーダのサポートの詳細

https://docs.unity3d.com/Packages/com.unity.polyspatial.visionos@1.3/manual/Materials.html

* Unity シェーダー グラフを介して定義されたカスタム シェーダーが、RealityKit と相互運用するためにどのようにマテリアル X に変換されるかについて

https://docs.unity3d.com/Packages/com.unity.polyspatial.visionos@1.3/manual/ShaderGraph.html


* ライティングのサポートについて

https://docs.unity3d.com/Packages/com.unity.polyspatial.visionos@1.3/manual/PolySpatialLighting.html

* Render Textureについて
描画を更新するにはスクリプトでの操作が必要です。
詳細はドキュメントを参照してください。

https://docs.unity3d.com/Packages/com.unity.polyspatial.visionos@1.3/manual/RenderTextures.html

* リアルに影を落とす
MeshRendereを持つGameObjectにVisionOSGrowndingShadowコンポーネントをAddComponetすると現実側に影を落とせます。

 https://docs.unity3d.com/Packages/com.unity.polyspatial@1.3/api/Unity.PolySpatial.VisionOSGroundingShadow.html


### レンダリングパイプライン
URPとBuilt-in レンダーパイプラインの両方をサポートします。

どのレンダーパイプラインでもカスタム ShaderLabシェーダーをサポートしていません。
プロジェクトでカスタムシェーダーを使用する場合、それらはすべてUnityのシェーダーグラフを使用して作成する必要があります。


https://docs.unity3d.com/Packages/com.unity.polyspatial.visionos@1.3/manual/PortingUnityProjectsToPolySpatialXR.html



### 困ったら
FAQを見ましょう。
意外な落とし穴があったりします。

https://docs.unity3d.com/Packages/com.unity.polyspatial.visionos@1.3/manual/FAQ.html


### フォーラム
Unity Discussions上で活発にやり取りされています。
不具合を発見した際などはこちらへ共有すると良いと思います。
私も報告した結果修正された事がありました。

https://discussions.unity.com/c/visionos/16

### 既存コンテンツの移植でハマったこと
UnityのDllなどのライブラリはビルド対象のターゲットを選択するものがあります。
ビルドターゲットにVision OSが新たに増えましたので、自分で選択しないとビルドに含まれないケースがあります。

例えばPlaymakerの場合、PlaymakerのdllでVisionOSにチェックを入れる事で動作しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/63a5fdcb-2d7c-d14f-77e8-2f78e2cc539a.png)

### 参考情報
今後のロードマップはこちらで確認できます。
各機能の進捗状況や今後対応される内容が大まかに分かります。

https://portal.productboard.com/unity/77-unity-visionos-roadmap/tabs/272-mr-immersive-features

### 終わりに
Vision Pro発売に向け、Unityをはじめとした開発環境はどんどんアップデートされている印象です。
本記事もアップデートの際は更新していきたいと思います。