JUL 2, 1993

Miaw VR

A room-scale VR systems showcase for Quest 3 standalone. You stand at a bench in an automated QA facility - never locomoting - while a deadpan narrator briefs a task, you perform it with a physical instrument, and the facility scores the result against a spec. Pass, a stamp fires and the next door unlocks. The whole thing is built on Unity's OpenXR + XRI stack in C#, and the systems are the deliverable, not the game.

Video only No in-browser build - Quest 3 standalone. The clip below is the placeholder capture.

Miaw VR
EngineUnity
LanguageC#
PlatformQuest 3
StackOpenXR / XRI
RenderingURP Mobile
ScaleRoom-Scale
Systems Built
  1. 01
    Architecture Station-Verifier Spine

    Built verification as a structural concern rather than an afterthought: an instrument only produces a record of what happened (IInstrument<TSample>), and a Station<TSample> owns a ScriptableObject Verifier<TSample> that consumes the record and returns a result. The invariant - "unscoreable doesn't ship" - is enforced at the station level: a station with no verifier refuses to arm and its door stays locked. Station.cs

  2. 02
    Canvas Painting & Trace Scoring

    The flagship station: a physical pen whose tip is a depth query against the canvas plane - not a physics contact - painting into a RenderTexture with depth read as pressure. Scoring never touches the CPU per frame; the ink is compared against a target mask in a single AsyncGPUReadback fired the moment the stamp comes down. PaintCanvas.cs, TraceScorer.cs

  3. 03
    Range Pistol & Grouping Verifier

    A second station proving the spine generalises: a pistol with a physical rack and a magazine that seats through an XRSocketInteractor (kinematic while socketed so velocity tracking never buzzes against the static rack). Shots register as a statistical sample and a grouping verifier scores the spread - a different scoring shape behind the same station contract. Firearm.cs, GroupVerifier.cs

  4. 04
    Grab Velocity-Tracked Hands

    No colliding physics hands - on a mobile GPU they jitter and fight the solver. Instead the hand carries no physics and the grabbed object does: Velocity Tracking movement, per-object hand-placed attach transforms, throw smoothing, and sockets for anything that would otherwise buzz against static geometry. Weight and physicality live in the object, not in a clever hand solver.

  5. 05
    Narrator Off-Script Personality Bus

    The narrator is the entire personality budget, driven through a ScriptableObject NarratorChannel event bus - no god-singleton. It supports barge-in and, more importantly, reacts to misuse: throw the pen, aim at the speaker, press the button labelled DO NOT PRESS, and it has something to say. The off-script reactions matter more than the scripted lines. NarratorChannel.cs, ForbiddenButton.cs

  6. 06
    Performance 90 fps on Standalone

    The budget is 90 fps on a full scene, on-device. Quest defaults to 72, so the display refresh rate is requested up to 90 at runtime through the Meta display utilities, and the heavy work - the canvas scoring - is deferred to an async GPU readback on the stamp rather than a per-frame pixel read. DisplayRefreshRateController.cs