
PolySpatial の実践Tips 前編
はじめに
みなさん Vision Pro で遊んでいますか?
Unity エンジニアの我々は PolySpatial の公開直後は、さぁこれで何を作ろうかとワクワクしたものです。
しかし、いざ開発を始めてみると苦労の連続でした…
本記事では Apple Visio Proアプリ 視線de定規 の開発過程で苦労したことや、他所ではあまり語られていないことを Tips 形式で紹介していこうかと思います!
たくさんあるため、前編(本記事) と 後編 に別れています。
前編は、開発を行う準備段階での Tips が中心になっています。
注意点
Unity や PolySpatial の基礎的なことは言及しないのでご容赦ください。
以降は 2024/7 時点の記事内容になります。
開発環境
Xcode 15.4
Unity 2022.3 LTS
PolySpatial 1.2.3
visionOS 1.2
Tips
1. Account
Unity Pro 以上のライセンスが必要。
Unity Personal のライセンスでどうなるかを試してみた。
新規に visionOS プロジェクトを作ろうとした場合
UXR Plug-in Management で visionOS のプラグインをインストールできない。

既存の visionOS プロジェクトを開こうとした場合
プロジェクトを開いた直後に警告ポップアップが表示される。
OKを押下してポップアップを閉じても、コンソールに大量のエラーが出力されてビルドができない。

2. Manual
Apple visionOS XR Plugin と PolySpatial visionOS の2つがある。
実際よく読むのは後者のほう。
Apple visionOS XR Plugin
https://docs.unity3d.com/Packages/com.unity.xr.visionos@1.2/manual/index.html
PolySpatial visionOS
https://docs.unity3d.com/Packages/com.unity.polyspatial.visionos@1.2/manual/index.html
3. App Icons
3層で1つの立体的なアイコンになっている。

Layer2 に注意が必要。
使用する画像にアルファ情報が含まれていると Xcode でビルド時にエラーになる。

4. Device Support
iOS アプリと同様に Device Support(個々のデバイスと通信するためのファイル群) を Xcode が作成する。

Device Support は Mac がそのデバイスに初めて接続してアプリをインストールするタイミングで作成するのだが、Wi-Fi で接続すると作成完了まで長時間待たされる。(通信環境によるが1時間以上待たされる場合も…)
解決方法は2つある。
1) デベロッパーストラップを購入
Vision Pro に有線で接続する Developer Strap が Apple より販売 されている。これを使うと1分も掛からずアプリをインストールできる!!
…でも高い、5万円以上する。(2024/7 現在)
2) サポートファイルを共有する
Device Support のファイル群の保存先は次になる。
/Users/[your name]/Library/Developer/Xcode/visionOS DeviceSupport/RealityDevice14,[Version Name][Version ID]
( ディレクトリ名の RealityDevice14,[Version Name][Version ID] の部分は上図の例だと RealityDevice14,1 1.2 (21O589))
接続するデバイスのバージョンに気をつけながら、別の Mac にこのディレクトリの複製を作る。すると、その Mac でも初回インストールで長時間待たされることがなくなる。
5. Unity visionOS Roadmap
開発ロードマップが公開されている。
今後どういった優先順位で機能が追加、改修されるかが分かる。
ただし、あくまでも予定のスケジュールのため、過信は注意。
https://portal.productboard.com/unity/77-unity-visionos-roadmap/
6. App Mode とインストールするパッケージ

勘違いしがちなことが幾つかある。
PolySpatial
次の APP Mode ではインストールは必須ではない。
Virtual Reality - Fully Immersive Space
Windowed - 2D Window
PolySpatial は Apple visionOS XR Plugin とは別のパッケージなので混同しないこと。
ARKit
どの Mode でもインストールが不要。
(Mixed Reality - Volume or Immersive Space であっても)
7. Mixed Reality の2つのモード
App Mode が Mixed Reality の場合はさらに2つのモードに分岐する。

各モードの意味
Volume
他所では Bound (境界あり) とか Shared (共有) と表現されている。
Windows OS で言う 「ウインドウで開いているアプリ」みたいなもの。
Immersive Space
他所では UnBound (境界なし) とか Exclusive (排他) と表現されている。
Windows OS で言う 「フルスクリーンで開いているアプリ」みたいなもの。
モードの設定方法
VolumeCameraWindowConfiguration の Scriptable Object をモードごとに作る。
Bound(Volume)

UnBound(Immersive Space)

シーン上に Volume Camera が付いた GameObject を必ず1つだけ置く。
Volume Window Configuration にどちらかの Scriptable Object を当てる。

アプリを起動するとアプリの設置予定場所から、どれくらいシーンをずらすかを この GameObject の Transform の Position も使って計算しているらしい。
ユーザが意図しない場所にアプリが設置される事態を避けるためにも、Position は (0,0,0) にしておくことが無難だと思われる。
各モードの特色
Bound(Volume)
ユーザは境界(Bound)の移動ができる
(v2.0では拡大・縮小もできるようになるとか)Volume Camera の Dimensions を介してプログラムから拡大縮小ができる
ハンドトラッキングは使用できない、よって手の位置や関節の情報を取得できない
平面や空間のメッシュの取得ができない
ユーザの位置は取得できない
UnBound(Immersive Space)
境界(Bound)の移動や拡大縮小はできない
ハンドトラッキングを使用できる、よって手の位置や関節の情報を取得できる
平面や空間のメッシュの取得ができる
ユーザの位置を取得できる
Bound(Volume) のサイズ
サイズの設定にはいくつかの手段がある
1.VolumeCameraWindowConfiguration の Output Dimensions
visionOS の仕様上ビルド前に必要な設定
実行時には変更ができない
(1, 1, 1) もしくはアプリ起動直後のサイズに合わせておくのが妥当
2.Volume Camera の Dimensions
実行時に変更ができる
VolumeCameraResizeListener (下述) が操作するのはこのプロパティ
3.Volume Camera を付いた GameObject の Transform の Scale
Volume Camera の Dimensions にこの Scale を掛けた結果が、最終的な Bound(Volume) のサイズになる
VolumeCameraResizeListener
Bound(Volume) のサイズを変更すると、同期して Bound 内の Game Object 群も拡大縮小する。
よって、仮に (1, 0.5, 1) と変更してしまうと、Bound 内の Game Object 群は「押されて潰れた」ような見た目になる。
これを防ぐためのコンポーネント VolumeCameraResizeListener が PolySpatial のサンプルに含まれている。
とくに事情がなければ付けることをお薦めする。

8. PBXProject.GetPBXProjectPath
Build Settings が visionOS であっても PBXProject.GetPBXProjectPath が返すパスの .xcodeproj の名称が誤っているので注意
誤: Unity-iPhone.xcodeproj
正: /Unity-VisionOS.xcodeproj/
public void OnPostprocessBuild(BuildReport report)
{
if (report.summary.platform != BuildTarget.VisionOS)
return;
var path = report.summary.outputPath;
// [output path]/Unity-iPhone.xcodeproj/project.pbxproj を返してくる
var projectPath = PBXProject.GetPBXProjectPath(path);
}
おわりに
いかがでしたか?
Vision Pro のアプリ開発が初めてと言うこともあり、準備段階でも色々と勉強になることがありました。
さて、では開発して行くぞ! …なのですが、開発中もコツや覚えないといけないことがありました。
次回 後編 はその話をしていこうかと思います。