Microtube Docs
Developers / Tutorials / Meta Quest walkthrough

Meta Quest tutorial project

Sideload the finished demo, then open the same project in Unity and follow how every part of it works.

Try it on a headset first

Before installing anything, put the finished tutorial on your Quest and feel what you are about to build. This is the tutorial project, already built — no Unity, no compiling.

Download the Quest APK (84 MB)

You need a glove for the haptics

The scenes run and hand-tracking works without one, so you can look around and see how everything is put together — but nothing will actuate until a HEXR glove is paired.

Sideloading it

Quest headsets do not install APKs from a file manager; you push the build from a computer. Either tool works — SideQuest ↗ if you would rather click than type, or adb if you already have the Android platform tools:

shell
adb install -r HexR-Developer-Tutorial-MetaOVR.apk

Both need Developer Mode enabled on the headset, which you turn on in the Meta Quest phone app under your headset's settings. Once installed, the app appears in your library under Unknown Sources rather than alongside your store apps — that catches most people out the first time.

Give the headset its Bluetooth permissions

Do this before you launch the app, whether you sideloaded it or built it yourself. The glove talks to the headset over Bluetooth Low Energy, and Android will not let an app discover a BLE device without location permission — a quirk of how Android treats BLE scanning, not something HEXR chose. Skip this and the app looks broken: it runs, but the glove never appears.

In the headset, go to Settings → Privacy and Security → App Permissions and set:

PermissionSet to
LocationPrecise — not just “allowed”
Nearby DevicesOn
The single most common support question

“The app runs but the glove never connects.” It is almost always these two permissions. Check them first, before suspecting the hardware or your code.

Get the project

Clone the repository and open it in Unity 6 (6000.0 or newer):

This project’s floor is higher than the package’s. com.microtube.hexr itself runs on Unity 2022.3 and newer; it is the Meta XR SDK pinned here (com.meta.xr.sdk.all 205.0.0) that declares "unity": "6000.0" and sets the floor for this repository.

shell
git clone https://github.com/MicrotubeTechnologies/HexR-Developer-Tutorial-Meta-OVR.git

There is nothing to install afterwards. The HEXR package is already embedded in the project at Packages/com.microtube.hexr, so Unity picks it up the moment the project opens. You do not add it through Package Manager here — that step is for your own projects, and is covered in Unity integration.

You do need the Meta XR SDK, because this tutorial targets the Meta OVR backend and Unity's registry does not carry it. Add the free Meta XR All-in-One SDK ↗ to your Unity account, then install it from Package Manager → My Assets. If you would rather work in OpenXR, use the OpenXR tutorial ↗ instead.

How the project is laid out

Two folders matter. Everything else is set dressing.

WhereWhat it holds
Assets/Scenes/The tutorial scenes. This is where you start.
Packages/com.microtube.hexr/The HEXR package itself — the rig prefabs, the components, and the HaptGlove runtime that talks to the hardware. Read it, do not edit it; in your own project this is a read-only dependency.
Assets/Tutorial/Art/Models, materials and effects for the demo scenes — the hospital room, the fountain, the storm cloud. Nothing HEXR-specific.
Assets/Tutorial/Scripts/Small helper scripts belonging to the demos rather than to HEXR.

The useful habit: when a scene does something you want to reproduce, select the object and read its components in the Inspector. Every haptic behaviour in these scenes is a component on an object, not hidden code.

The scenes, and what each one teaches

SceneWhat it demonstrates
1. Basic TutorialThe place to start. Four objects, four different ways to trigger feedback: a foam block (haptic zone on a child object), a key (pinch, fired from an interactor event), a torch (palm grab, plus a vibrating flame zone) and a button (poke).
2. Hospital TutorialThe same ideas dressed as a realistic training scene — closer to what a real application looks like.
3. Water EffectsFeedback driven by trigger volumes rather than grabbing: reach into the fountain or under the rain cloud and the zone drives the effect.
Meta Vs HexR GrabA side-by-side of Meta's grab interactors against HEXR's own HexRGrabbable, so you can feel the difference before committing to one.
Two ways to grab

Meta's interactors and HexRGrabbable both work, and they feel different — the physics and the haptic trigger points are not the same. Neither is the “right” one. Try the comparison scene and pick per object.

Connecting the glove

HEXR does not pair through the headset's Bluetooth settings, and there is no companion app. Your application opens the connection itself, which is why the permissions above matter.

Power on the arm module, then either press Connect on the in-scene HexR Panel — every tutorial scene has one — or call it yourself:

csharp
ConnectLeftBT();   // left hand
ConnectRightBT();  // right hand

Each hand is an independent connection with its own battery and its own state, so a working left hand tells you nothing about the right. Calibration & fit goes further.

Customising the haptics

Four routes, from “tick a box in the Inspector” to “drive the hardware directly”. They mix freely — most objects in the demos use more than one.

1. Make an object grabbable — HexRGrabbable

Add it to any object that also has a Collider set to trigger and a Rigidbody. Because the interaction is physics-based, the collider shape matters more than you expect — match it to the visible object or grabbing feels wrong.

SettingWhat it does
Type of GrabPalm needs the palm and at least one finger; Pinch needs the thumb and at least one finger. Pick whichever matches how the real object would be held.
GravityWhether the object falls when released.
Haptic sliderStrength of the squeeze while held: 0 is off, 60 is maximum.
On Grab / On ReleaseUnityEvents, for driving sound, scoring or logic off the same interaction.

2. Make a region feel like something — SpecialHaptics

A haptic zone is a trigger collider that plays a prepared sensation when a finger or palm enters it — the rain, the fountain spray and the torch flame in the demos are all this component. Add SpecialHaptics plus a trigger collider, press Find Hand Physics in the Inspector to wire it up, then choose an effect from the dropdown.

Size the collider to the sensation, not the mesh. The rain zone is a large soft volume; the flame is tight around the fire.

3. Fire haptics from an interaction event — Meta OVR

The two components above are physics-driven: a collider decides when something is being touched, so how good it feels depends on how well that collider matches the shape. Events sidestep that. Meta's interaction components raise UnityEvents at the exact moment a grab, pinch or poke is recognised, and you wire those straight to HEXR — no collider accuracy involved.

This is how the discrete interactions in 1. Basic Tutorial fire. Meta's PointableUnityEventWrapper turns an interactable's state changes into UnityEvents you can drop targets onto in the Inspector:

Wire this eventTo this method on PressureTrackerMain
When Select — grabbed, pinched or pressedTriggerAllHapticsIncrease(float) — squeezes every finger and the palm to the pressure you pass, 01
When Unselect — releasedRemoveAllHaptics() — lets everything go

Both are public and take either a single float or nothing at all, so they show up directly in the UnityEvent dropdown — there is no glue script to write. The same pair works from HexRGrabbable's own On Grab / On Release events if you are using HEXR's grabbing rather than Meta's.

Zone or event?

They answer different questions. A zone answers “is a finger inside this region?” — right for surfaces and materials, like rain, foam or a flame. An event answers “has this object been grabbed?” — right for discrete actions, where firing at the exact instant matters more than precisely where the fingers are. The torch in the demo uses both: an event for the pickup, a zone for the flame.

Remember that TriggerAllHapticsIncrease still checks IsHandNear() internally, so an event alone is not enough if nothing is feeding that signal — see the warning below.

4. Drive the hardware yourself

For anything the components do not cover, call the runtime directly through HaptGloveHandler (namespace HaptGlove). Pressure is a squeeze; vibration is a texture:

csharp
// finger, on/off, intensity 0.1-1.0, speed 0.1-1.0
HEXRPressure(finger, true, 0.8f, 0.5f);

// finger, on/off, frequency 0.1-40.0, intensity 0.1-1.0,
// peakRatio 0.2-0.8, speed 0.1-1.0
HEXRVibration(finger, true, 12f, 0.6f, 0.5f, 0.5f);
Nothing happening?

Every actuation is gated on whether HEXR thinks a hand is near the object. On Meta OVR that signal comes from the grab and poke interactors, so it is usually handled for you. On OpenXR it comes only from a ProximityCheck component — without one, the calls succeed and nothing moves. Run HexR → Validate Scene Setup; it flags exactly this.

Build settings

The project is already configured for Quest, so a fresh clone needs only the platform switch:

  1. Switch to Android

    File → Build Settings → Android → Switch Platform. First switch reimports every asset, so expect it to take a while.

  2. Check the headset is connected

    With Developer Mode on and the headset plugged in, it appears in the Run Device dropdown. Accept the “Allow USB debugging” prompt inside the headset — it is easy to miss with it on your face.

  3. Build And Run

    Builds, installs and launches in one step. Build alone gives you an APK to distribute instead.

For reference, these are the settings that make it a valid Quest build — useful when configuring a project of your own:

SettingValue
Minimum API levelAndroid 10 (API 29)
Target architectureARM64 only
XR plug-in providerOculus
Texture compressionASTC
Building for the store?

The tutorial ships as com.Microtube.HexRTest under the product name “HexR Test”. Change the package name and product name in Player Settings before you distribute anything, or it will collide with other people's installs of this same demo.

Where to go next

Once the demos make sense, the reference material picks up:

If you want to…Read
Add HEXR to a project of your ownUnity integration
Understand what triggers feedback and whenTriggering feedback
Work with hand-tracking rigsWorking with hand-tracking
Look up a method or an eventUnity (C#) reference
Drive the glove without UnityPython integration

Stuck on something the docs do not answer? Talk to us — or open an issue on the tutorial repository ↗.