PanoShard Documentation
The essential guides, distilled — from splitting your first panorama to tuning runtime performance.
Quick Start
After importing PanoShard from the Unity Asset Store, the Home Window opens automatically. These six steps take you from a raw 360° image to a playable tour.
- 1 Download the splitter
Open Tools → PanoShard → Split → 360 Images. On first run, accept the one-time download of the platform-native splitter executable — it is required for panorama processing and is verified with a SHA-256 integrity check.
- 2 Verify dependencies
In the Home Window's Package Check tab, install
com.unity.nuget.newtonsoft-jsonif it is missing. PanoShard tracks this for you. - 3 Split your first panorama
Convert a single equirectangular (2:1) image into a streamed tile set written under
StreamingAssets/. - 4 Create a Tour Graph
Right-click in the Project window → Create → PanoShard → Tour Graph. This ScriptableObject is the central data structure for your tour.
- 5 Add a start location
Open the graph, add a Location node, tick Is Start Location, and assign the tiles folder you created in step 3.
- 6 Auto-setup the scene
Run Tools → PanoShard → Scene → Automatic Setup, assign your Tour Graph to the TourManager, and press Play.
The workflow at a glance
Import → Download Splitter → Split 360° Panorama → Create Tour Graph → Add Location Nodes → Auto-Setup Scene → Assign Tour Graph to TourManager → Press Play.
Splitting 360° Images
The Splitter converts an equirectangular panorama into a hierarchical tile grid. At runtime, only the tiles inside the camera frustum at the current zoom level are streamed — this is the core performance strategy behind PanoShard.
- 1 Pick a mode
Use External Process (native executable) for large 16K+ images and production. Use Native (in-editor C#) for quick iterations on smaller panoramas.
- 2 Set input & output
Drag in the source image and name the output sub-folder under
StreamingAssets/. Leave the output blank to derive it from the file name. - 3 Choose tile size & max level
Keep Tile Size 512. Set Max Level to match how deep you want to zoom — each level doubles the grid (L1 = 2×1, L2 = 4×2, L3 = 8×4…).
- 4 Pick a format
KTX is recommended (GPU-compressed, low VRAM). Use JPEG for the widest platform compatibility.
- 5 Run the split
Process a single image or queue several with + Add Source Image for a sequential batch sharing the same settings.
Key parameters
| Parameter | Default | Notes |
|---|---|---|
| Tile Size | 512 | Balances load granularity and request count. |
| Max Level | 0 | Must match the location node's maxDetailLevel. |
| Output Format | KTX | KTX2, JPEG, or PNG. |
| Quality | 85 | JPEG/KTX quality factor (0–100). |
KTX2: ETC1S vs UASTC
KTX2 textures stay GPU-compressed in memory, dramatically reducing VRAM versus JPEG/PNG.
| ETC1S | UASTC | |
|---|---|---|
| Quality | Good | Near-lossless (Q=4) |
| File size | Smaller | Larger |
| Best for | Most tours, mobile | Archival, high-end VR |
Recommendation: stick with ETC1S and defaults. Switch to UASTC (Quality 3–4) only when you need near-lossless quality for high-end VR.
Output layout
Tiles are written per-encoding so multiple formats stay separated:
StreamingAssets/{OutputFolder}/
metadata.json
ktx2/ level_0/0/0.ktx2 level_1/... level_N/...
jpg/ level_0/0/0.jpg ...
A location only stores the Tiles Folder and an Image Extension — PanoShard appends the extension subfolder at runtime.
Building the Tour Graph
The Tour Graph Editor is a UI Toolkit node editor (like Shader Graph) for laying out your tour visually. Locations are nodes; navigation paths are connections between them.
- 1 Open the editor
Double-click the Tour Graph
.asset, or select it and click Open in the Inspector. - 2 Add location nodes
Add one node per 360° location via the toolbar or right-click menu. Use the Pick… button next to Tiles Folder to auto-fill the folder and extension from your tiles.
- 3 Configure each location
Set the Title, opening camera angles, FOV/pitch limits, and detail-level range. Match Max Detail Level to the splitter's max level.
- 4 Connect locations
Drag from one node's output port to another's input. Choose a direction —
AtoB,BtoA, orBoth— to control which transition hotspots appear where.
Location node properties
| Property | Description |
|---|---|
| Tiles Folder | Path under StreamingAssets/ (the root, not the jpg/ktx2 subfolder). |
| Image Extension | jpg, png, or ktx2 — selects which encoding is streamed. |
| Is Start Location | Loads on tour start. Flag exactly one. |
| Open H/V Angle | Initial camera yaw/pitch in degrees. |
| Min/Max FOV & Pitch | Camera zoom and look limits (default FOV 15°–78°). |
Comment nodes
Comment nodes are purely organizational — colored text boxes for documentation and grouping, with no runtime effect.
Placing Hotspots
Open the Hotspot Editor from any node's [Hotspots] button. It shows the actual panorama so you place interactive elements by clicking directly on the image.
- 1 Open the panorama viewer
Click [Hotspots] on a location node. Pan and zoom the equirectangular image (JPG, PNG, or KTX2 supported).
- 2 Choose a type and click to place
Pick a hotspot type from the selector, then click on the panorama to drop it at that 3D world direction. Drag to reposition.
- 3 Configure per hotspot
Use the per-hotspot inspector to set targets, text, URLs, icon, and scale.
Built-in hotspot types
| Type | Purpose |
|---|---|
| Transition | Navigate to another location (targetGuid, optional title override). |
| TextBlock | Show a title + body panel. |
| URL Redirect | Open a web URL on click. |
| North / South Marker | Define the 0°/180° reference for the radar and floor plan. |
Custom hotspots (programmatic)
Create a class extending HotspotData, a MonoBehaviour extending HotspotAnchor (override HandleInteractionClick()), and optionally an IHotspotEditor decorated with [HotspotEditor(typeof(YourData))]. Custom types are auto-discovered — no need to modify PanoShard source.
Guided Tours
Layer a curated, step-by-step narrative on top of your free-roam graph. Users follow a predetermined path with custom camera angles, restricted movement, and on-screen instructions.
- 1 Create the data asset
Right-click → Create → PanoShard → Guided Tour and assign your Tour Graph to its
baseTourGraphfield. - 2 Add steps
Open the Guided Tour Editor and add a Guided Location Step for each stop, linked to a location in the graph.
- 3 Override per step
Force camera angle, restrict FOV/pitch, lock the camera, disable zoom, and show instruction text for that step.
- 4 Set progression rules
Enable Auto Advance (after required hotspots are interacted with), add a delay, and allow skipping or backtracking at the tour level.
GuidedTourManager events
The GuidedTourManager fires UnityEvents you can hook from the inspector:
- Lifecycle: OnTourStarted / Completed / Paused / Resumed / Stopped
- Steps: OnStepStarted / Completed / Changed
- Hotspots: OnHotspotViewed / Interacted / OnProgressionReady
Floor Plans & Minimap
Position location markers on 2D floor-plan images to give viewers their bearings. At runtime the FloorPlanUI renders the map and the RadarHandler shows the current viewing direction.
- 1 Create the floor plan data
Open Tools → PanoShard → Utils → Floor Plan, select the related Tour Graph, and click Create New Floor Plan Data.
- 2 Add floors and markers
Add one or more floor layers (each with its own map image) and drag location markers onto the map. Switch floors via tabs.
- 3 Wire it to the tour
The
FloorPlanDataasset is referenced by the Tour Graph'sfloorPlanfield. Spawn the FloorPlan prefab for the in-game minimap.
Runtime components
- FloorPlanUI — renders the map with per-location markers; supports multi-floor navigation and fullscreen toggling.
- RadarHandler — draws a rotating direction arc, auto-calibrated from the North/South marker hotspots.
Scene Setup & Generation
PanoShard offers a one-click scene setup for tile streaming, plus a graph-driven generator for additive scene streaming.
- 1 Automatic setup
Tools → PanoShard → Scene → Automatic Setup spawns the TourManager, TransitionManager, CameraController, and a Sphere — plus an EventSystem if missing.
- 2 Assign and play
Drop your Tour Graph onto the TourManager, confirm the TileLoader and SphereSegmentGenerator settings, and press Play.
- 3 Or generate from graph
Scene → Generate From Graph creates one Unity scene per location plus a bootstrapper and manifest — for additive scene streaming instead of tile streaming.
Tile streaming vs scene streaming
Tile streaming (default) dynamically loads tiles per viewport — best for gigapixel fidelity and small builds.
Scene streaming loads each location as a separate Unity scene additively (set TourManager.runtimeMode = SceneStreaming). Better for pre-authored per-location content; trade-off is larger builds.
Build optimization
After a build, the PanoShardPostBuildProcessor detects panorama folders in StreamingAssets/ not referenced by any scene and opens the StreamingAssets Optimizer so you can strip unused tiles. Review before deleting — dynamically loaded locations are flagged as unused.
Runtime Components
The scene that Automatic Setup builds wires together a handful of core MonoBehaviours. Here's what each one does.
TourManager
Central controller. Reads the TourGraph, loads the start location, handles transitions and hotspot lifecycle, and fires OnLocationChanged / OnHotspotSpawned events. Key fields: tourGraph, loader, runtimeMode, sceneManifest.
TileLoader
The tile streaming engine: frustum culling, an LRU texture cache (default 100 MB), async loading (default 2 concurrent requests), and cross-faded zoom transitions. Tune cacheMaxSizeMB, maxConcurrentRequests, and qualityPreset.
SphereSegmentGenerator
Generates the hierarchical sphere mesh, pooling segments by level/x/y/density. Controls meshDensity (default 35) and sphereRadius. Sparse mode creates segments on demand.
CameraController & TransitionManager
CameraController handles rotation, zoom, inertia, and touch/VR input via swappable ICameraStrategy implementations. TransitionManager provides Fade, Zoom Warp, and Spherical Warp transitions between locations.
Panoshard facade (code)
Panoshard.LoadLocation(locationInfo);
var loader = Panoshard.GetTileLoader();
var tour = Panoshard.GetTourManager();
Panoshard.SetTilesFolderUrl("http://example.com/tiles/");
For programmatic tours, build a graph fluently with TourGraphFactory (AddLocation → ConfigureCamera → AddConnection → AddTransitionHotspot → Build).
Performance, VR & Quality
Dial in fidelity per device with Quality Presets, and enable VR with a single support component.
- 1 Create a Quality Preset
Create → PanoShard → Quality Preset, then assign it to the TileLoader's
qualityPresetfield to control filtering, aniso level, mip bias, and VSync. - 2 Enable VR
Import the
XRInteractionToolkit_VR_Supportpackage, add PanoShardVRSupport to your camera rig, and assign the stereoInvertNormalsURPShaderVRmaterial.
Recommended preset tweaks
- VR: LOD Bias 1.0, Aniso Level 4+.
- Mobile: Bilinear filtering, VSync Count 1, ETC1S KTX tiles.
ECS culling (experimental)
Import ECSTileSystem_Experimental and the Unity Entities package, then switch the TileLoader's tile system to EcsTileSystem to offload frustum culling to Burst-compiled parallel jobs for very high tile counts.
Platform Support
PanoShard targets Unity 6+ with URP across desktop, mobile, WebGL, and VR.
Support matrix
| Platform | Tile | Scene | VR | Notes |
|---|---|---|---|---|
| Windows | ✓ | ✓ | ✓ | Full support |
| macOS | ✓ | ✓ | ✗ | VR not tested |
| Android | ✓ | ✓ | ✓ | ETC1S KTX recommended |
| iOS | ✓ | ✓ | ✗ | JPEG for widest compat |
| WebGL | ✓ | Limited | ✗ | HTTP range requests |
Ready to build?
Grab PanoShard from the Unity Asset Store, or dig into the complete reference documentation.