WebXR / Browser VR
Frustrain Trainman — a WebXR adventure for Viverse
Film XR

Task
A story-driven VR game — a dystopia with horror and puzzles aboard a surreal Eastern European train — had to run right in the Quest headset’s browser on HTC Viverse, with no store and no install.
What we built
- An event-driven story engine: the script in JSON (108 events), quests as data, a world reset before every quest.
- 5 quests, 17 journal tasks, 38 items, 8 save points.
- Inventory, journal, item inspection, a glowing hint when the player is idle.
- A web-based quest editor for the writers.
Engineering decisions
- A patched WebXR plugin: stereo on vertically split framebuffers, and the black screen on entering VR.
- Optimisation for the Quest browser: raycast throttling, instancing, static batching, stencil-based clipping, compressed textures.
- The built-in occlusion culling (~14% of CPU time) replaced with our own system of door-driven “airlock” zones.
Stack
Unity 6 WebGL, WebXR, XR Interaction Toolkit, Viverse SDK

