Contents
  1. 0. Introduction to Vision Pro Development
  2. 1. Vision Pro Developer Mode and Wireless Debugging
  3. 2. Installing Unity 2022.x and PolySpatial 1.0
  4. 3. Installing Unity 6 and PolySpatial
  5. 4. visionOS App Forms
  6. 5. Volume Camera

0. Introduction to Vision Pro Development

Vision Pro apps can be developed with Apple’s existing Swift tools or with Unity. Unity is the better fit for MR/VR games and 3D interaction.

Unity’s Apple Vision Pro toolkit is called PolySpatial.

(1) Hardware requirements

  • A Mac with an M-series chip
  • Apple Vision Pro

(2) Software requirements

  • Xcode 15.2 or later, with the visionOS module installed
  • the visionOS SDK (which can also be imported from Unity)
  • Unity Pro 2022.3.18f1 or later (apply for a free Pro license through the Unity Student plan)
  • An Apple Developer account, if you need to run the app on a physical Vision Pro

1. Vision Pro Developer Mode and Wireless Debugging

Connect Apple Vision Pro and the Mac to the same Wi-Fi network, then install and run the project on the headset over the local network.

(1) Pair Vision Pro with a Mac

Open Xcode and create a new project.

Select the visionOS template.

Xcode template chooser with the visionOS App template selected

Enter a project name and choose a location.

This creates a new Xcode project.

On Vision Pro, open Settings > General > Remote Devices.

In Xcode, choose Window > Devices and Simulators. The pairing sheet should appear; click Pair. (Vision Pro and the Mac must be on the same local network. If the sheet never appears, try a phone hotspot.)

Xcode Devices and Simulators window showing the Vision Pro pairing dialog

Vision Pro displays a pairing code. Enter it and click Connect.

Pairing PIN displayed on Apple Vision Pro

(2) Enable Vision Pro Developer Mode

Scroll to the bottom of the Vision Pro Settings app. Enable Developer Mode.

(3) Run an Xcode project on a physical Vision Pro

Xcode targets the simulator by default. To run on the headset, use the destination control at the top of the window and choose the paired Apple Vision Pro. The headset’s visionOS version must be at least as new as the project’s minimum visionOS deployment target.

Xcode toolbar with Apple Vision Pro selected as the run destination

Select the project in the navigator, open Signing & Capabilities, choose Team, and pick your developer account. You need to do this for every new project.

Xcode Signing & Capabilities with a developer Team selected

Click Run to install the app on Vision Pro. It appears in the visionOS home view; open it and you should see Hello World.

Possible error: Apple Vision Pro’s visionOS doesn’t match project. The headset OS version and the Xcode visionOS deployment target must match. Select the project in the navigator, then under General set Minimum Deployments for visionOS.

2. Installing Unity 2022.x and PolySpatial 1.0

(1) Install Unity

Download Unity Hub from the international Unity website, then use it to install Unity Pro 2022.3.18f1 or later. Students can get Pro at no cost through the Unity Student plan.

Click the gear icon next to the editor version, choose Add modules, and add visionOS Build Support.

Unity Hub Add Modules dialog including visionOS Build Support

Unity Hub module list with visionOS Build Support enabled

(2) Create a project

Create a project from the Universal 3D template. You can change the name and location on the right.

Unity Hub new project screen using the Universal 3D template

In the project, open File > Build Settings and switch the platform to visionOS. Choose device (not simulator) debugging:

Unity Build Settings with the visionOS platform and device selected

(3) Install the plug-in

Open Edit > Project Settings, find XR Plug-in Management, and install it. You need this plug-in for AR/MR work; windowed apps can skip it.

XR Plug-in Management install panel in Project Settings

Open XR Plug-in Management again and enable Apple visionOS. That option is available only with a Pro license. If a warning appears, click Yes. Unity restarts and reimports packages; enable Apple visionOS again afterward.

XR Plug-in Management with Apple visionOS enabled

Still in this panel, open XR Plug-in Management > Apple visionOS. App Mode switches between VR and MR. Later projects in this series are MR, so set it to MR here. Unity then installs PolySpatial.

Apple visionOS App Mode set to Mixed Reality

Open Project Validation, find Fix All under the Vision Pro icon, and click it. Unity repairs common environment issues.

Project Validation showing Fix All under the Vision Pro icon

Open Apple visionOS and fill in Hands Tracking Usage Description and World Sensing Usage Description.

When the app asks for hand tracking or world sensing, Vision Pro shows a permission dialog. These strings are the explanation under the main heading.

Hands Tracking Usage Description and World Sensing Usage Description fields

(4) Import the PolySpatial sample scenes

Open Window > Package Manager, select the PolySpatial package, and import its Samples. That brings in template settings and sample scenes.

Package Manager with the PolySpatial package Samples section

After import, the samples live under Assets > Samples > PolySpatial > Scenes.

Open ProjectLauncher and import TMP when prompted.

ProjectLauncher sample scene prompting a TMP import

Then open File > Build Settings, drag every PolySpatial sample scene into Scenes in Build, and move ProjectLauncher to the top of the list (it is the launcher for the other scenes).

Build Settings Scenes in Build list with ProjectLauncher first

(5) Configure streaming for device debugging

Open PolySpatial’s Play to Device page. It includes a TestFlight link for installing TestFlight and Unity’s Play to Device software.

Unity Play to Device documentation with the TestFlight install link

Install TestFlight on the headset and sign in with the same Apple Account as the Mac. The Unity Play to Device app appears there.

Open the Play to Device Host app. Note the IP address on that screen.

In Unity, open Window > Play to Device, enter the Vision Pro IP address, give the device any name, and click Add Device. Select Connect in the list, then set Connect on Play to Enable.

Play to Device window with a connected Vision Pro

Return to Unity and click Play to stream the running scene to the headset.

When you finish, stop playback in the Unity Editor rather than closing the app on Vision Pro. If Play does not reach the headset, confirm the IP address. You can also press and hold both top buttons on Vision Pro, force-quit the Play to Device app, relaunch it, and click Play in Unity again.

Streaming still depends on the Unity Editor. The next section packages the project as a standalone app.

(6) Build an Xcode project

Open File > Build Settings and click Build. Choose a folder for the generated Xcode project, then click Choose.

Build dialog choosing a folder for the generated Xcode project

When the build finishes, open that Xcode project and run it the same way as in the previous section.

3. Installing Unity 6 and PolySpatial

(1) Install Unity

Download Unity Hub from the international Unity website — only that build can install Unity 6 — then install Unity 6.0 or later. Students can get Pro through the Unity Student plan.

Click the gear icon next to the editor version, choose Add modules, and add visionOS Build Support.

(2) Create a project

Check the Unity Editor version and choose Universal 3D.

Unity 6 Hub creating a Universal 3D project

(3) Import PolySpatial 2.0

Open File > Build Profiles, switch the platform to visionOS, and set the target SDK to Device if you want to debug on the headset.

Unity 6 Build Profiles with visionOS and the Device SDK

Open Edit > Project Settings, install XR Plug-in Management, enable Apple visionOS, and on the computer enable PolySpatial XR.

XR Plug-in Management with Apple visionOS and PolySpatial XR

Then open the Apple visionOS settings and match the options below. The two description fields can be any short explanation.

Apple visionOS player settings including usage descriptions

Sample import and Play to Device are the same as before, except you need Play to Device v2.

4. visionOS App Forms

(1) Space types

  • Shared Space: 2D windows or 3D apps can run together in the same space
  • Full Space / Immersive Space: one app occupies the entire space

Shared Space is like overlapping desktop windows; Full Space is like full screen.

ARKit features — hand tracking, scene mesh, head tracking, and object tracking — work only in Full Space, not in Shared Space.

(2) App forms

  • Windowed mode: a 2D window, similar to an iOS or Mac app.
  • VR mode: a fully virtual environment rendered by Unity.
  • MR mode: virtual content in the real world. It can be shared or exclusive (Full Space), uses Apple’s CompositorServices, and renders with Metal.

5. Volume Camera

  • In shared space, an app sits inside a cube with a bounding box.
  • In exclusive space, the app has no boundary; the whole space is its container.

(1) Create a scene

In the Project panel, open Assets > Scenes, create a scene (for example, SharedSpace_VolumeCamera), and double-click it.

New scene created under Assets/Scenes

(2) Add a Volume Camera

In the Hierarchy, right-click an empty area and choose XR > Setup > Volume Camera.

Hierarchy menu adding an XR Volume Camera

Select the Volume Camera and, in the Inspector, set Volume Window Configuration. Click the circle on the right. If the PolySpatial samples imported correctly, you should see Bounded… (with a boundary) and Unbounded… (without one).

Volume Camera configuration picker with Bounded and Unbounded presets

To create your own configuration, go to Assets > Samples > PolySpatial > Resources and choose Create > PolySpatial > Volume Camera Window Configuration.

The asset must live in a Resources folder. That folder can be anywhere under Assets.

(3) App bounds versus Volume Camera bounds

  • App bounding-box size: in Bounded_VolumeCameraConfiguration, edit Output Dimensions. The unit is meters.
  • Volume Camera bounding-box size: in the Volume Camera Inspector. Size is Dimensions × Scale.

The app bounding box is how much space the app occupies when it launches on Vision Pro.

The Volume Camera bounding box is the volume Unity renders (only objects inside it are drawn).

If you keep the app bounds fixed and enlarge the Volume Camera bounds, objects appear smaller so everything still fits on screen.