🍣

Vision Proアプリ開発記【1. 環境構築編】

2025/03/11に公開

はじめに

こんにちは!ambrで4月からインターンをしている、こんしると申します。

いきなりですが、ambrから作業集中アプリ「gogh」のベータ版のスマホアプリが登場しました!
自分で製作した空間でアバターと一緒に作業に集中したりアバターを愛でたりできる、そんな魅力的なアプリになっています。ぜひお試しください〜!

https://x.com/tbutcoffee/status/1813137259329429903?s=46

このアプリの開発がまさに進行中のところで自分が入社し、これのApple Vision Pro版を作ろう、ということになりまして、Vision Proでの開発はおろか60万円の機材を扱うこと自体が人生初という状態から開発をスタートし、Vision Proが日本に上陸したての7月上旬に「gogh: Spatial Focus Timer」として無事アプリリリースに至りました。
https://apps.apple.com/jp/app/gogh-spatial-focus-timer/id6511229977

ちょうどこれを書いているときにApp Storeの「新作と注目作」に入ったらしく、嬉しくてニコニコしながらタイピングしています。
AppstoreRanking

さて、本題に入ります。

この記事シリーズはアプリとして出すまでで何回か壁にぶつかったポイントを、備忘録的にまとめたものになります。
不具合やつまづいた点の紹介ですので、環境構築やUnityの操作などの内容は割愛させていただきます。
アプリ開発のお役に立てれば幸いです。

  • UnityでVision Proアプリを開発する環境構築(この記事)
  • Unityを介したアバターモデルのVision Pro移植

https://zenn.dev/ambr_inc/articles/7c08bdba2d2d53

  • Swift UIとUnityの連携

https://zenn.dev/ambr_inc/articles/0cb439ef6c9549

3Dモデルを持ち込む

アプリを制作する以前の話として、Vision Pro上に単に3Dモデルを持ち込むだけであれば、アプリを制作する必要はありません。
したがって、Unity Proライセンスがなくとも、そしてWindowsのPCでも可能です。
自分が認識している方法としては2つあって、

  • STYLY for Vision Proを用いる
  • .usdzファイル形式のデータとして書き出す

というものです。

STYLY for Vision Proを用いる方はとにかく簡単。
詳細な説明は省きますが、Unity上でweb上にアップロードし、アプリ内でアップロードされたデータのURLを開くだけで3Dモデルを持ち込めます。

https://styly.cc/ja/manual/styly-for-vision-pro-content-production-manual/#STYLY_for_Vision_Pro_Unity-2

ただし、例えば3Dモデルにアニメーションをつけた状態で持ち込みたい場合など、STYLYの方では対応されていないこともあるので、後者の.usdzファイルとして書き出す方法を使用することになります。参考にしたのは以下の記事です。

https://qiita.com/yaegaki/items/1d5459b4dc07d1fa9e45

https://nakamura001.hatenablog.com/entry/2021/09/30/_Unity_を使って_iPhone_向けの_AR_コンテンツを簡単に作る方

自分の場合、アバターの3Dモデルをアニメーション付きで持ち込むために、上に挙げたQiita記事の方法とhatenablogのRecorderを使用する方法を用いてアニメーション入りのモデルとして書き出しました。

ただし、なぜかmeshとmaterialの対応がずれて正しいmaterialが反映されなくなったり、materialの数だけ本来のmeshが複製されてたくさんの部屋が重なった謎の空間ができたりと、不具合が発生しました。
RoomError

この不具合の原因や解決策は結局分からず、不具合が生じたGameObjectをオフにして削るという応急処置しかできませんでした……。

またこの件とは別に、アバターの3Dモデルを持ち込む場合にはアバターならではな要件が発生するようです。
これについては先ほどのyaegakiさんのqiita記事がとても参考になります。

かなり詰まったので、また別の記事で詳しく書こうと思います。

アプリ開発

環境構築

3Dモデルを見るだけではなく、何らかの機能を待ったアプリにしたい場合、以下のものを準備する必要があります。

  • Apple Sillicon搭載Mac
  • Unity 2022.3.19f以降 (Pro, Industryライセンスのみ)
  • PolySpatial
  • Xcode 15.2以降
  • Vision ProのSimulator

詳細な環境構築の方法などは以下を参考にしていただけると!

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

https://qiita.com/afjk/items/74c35b254f31a0e3646b

特に、PolySpatialを動作させるためにはUnity standardライセンスでは不十分で、Unity ProやIndustryライセンスなどが必要になります
ただし学生のうちはUnity Student Planを申し込むと、無料でUnity Proプラン同様にPolySpatialを用いて開発できます!
学生こそVision Pro開発をしよう!学生のうちに実機を入手できるかは別ですが……

デバッグ環境

開発する上で必要なデバッグ環境について、本来Buildの手順としては、

  1. UnityでBuild
  2. SwiftでBuild
  3. Vision Pro実機やSimulatorで動作を確認

といった感じになりますが、動作確認の度にいちいちUnityとSwiftで2回Buildするのはかなり面倒です。
そこで、Unityで実装する範囲であれば、UnityのPlayモードで挙動を確認できるPlay To Deviceを用いるのがよいです。

https://docs.unity3d.com/Packages/com.unity.polyspatial.visionos@1.2/manual/PlayToDevice.html

https://qiita.com/Cova8bitdot/items/de9d9f174e607b47952c

Unity側でPlay To Deviceをインポートしつつ、Simulatorまたは実機上にPlay To Deviceのアプリをインストールし、Unityのメニューに対応するデバッグ対象のポート番号を入れて双方を繋げます。
この状態でUnity上でPlayモードにすると、自動でSimulatorあるいは実機でデバッグが立ち上がり、挙動を確認できるようになります。

注意として、Play To Deviceでの挙動・SimulatorにBuildしたときの挙動・実機にBuildしたときの挙動が必ずしも一致しないことがあるようです。
実際、Play To Deviceだと音声が流れなかったがBuildすると流れたり、Simulator上だとanimationが正常に動かなかったが実機にBuildすると正常に動いたりといったことがありました。
不具合に遭遇したら一旦Buildして確認してみるのは手です。

また、実機の場合なぜかUnity側との接続が逐一切れてしまう現象に遭遇しました。
Play To Deviceアプリを強制終了して開きなおすと解決しました。
恐らくUnityかVision ProかPlay To Deviceのどこかに何かしらの不具合が発生しているような気がしています。

さらに、Play To Deviceを用いたデバッグはUnity内で完結する挙動のみ確かめられるため、逆にいえばUnity以外が絡むもの、例えばSwift UIと連携した機能などのデバッグでは使用できません。
面倒ですがこの場合は都度Buildしなければならないようです。
こればかりはどうしようもない気がするので、うまくUnity内の機能とswift内の機能を切り分けてそれぞれでデバッグしやすくする設計をするのが良いと思われます。(自分はその辺りを雑にやってしまったので、いちいちBuildで5分近く待たされていました……。)

まとめ

  • 3Dモデルを表示するだけであれば、STYLY for vision proアプリやusdzを用いてWindows PC / Unity Standardライセンスの環境下でも作成可能
  • アプリとして作成するなら、Mac / Unity Proライセンス / Swiftなど諸々の準備が必要(Unityは学生プランでもok)
  • Unity制作のデバッグはPlay To Deviceがオススメ、ただし必ずしも実機Buildの環境と一致するわけではないことに留意
ambr Tech Blog

Discussion