This extension is not designed to run on your device. Add it to a collection to play later, or you can try to run it anyway.

Build fully immersive VR games in GDevelop — no coding required. This extension family brings the WebXR API into GDevelop's event-sheet workflow, giving you spatial tracking, controller input, physics-driven interactions, and a complete inventory/holster system out of the box.

Free to use. Works in the browser on Meta Quest and any WebXR-compatible headset.

The extension ships as four files you install into your project:

  • webxr — core (required for everything)
  • webxr_archery — bow and arrow system
  • webxr_doors — physical doors and key locks
  • webxr_teleport — arc teleport locomotion

For technical documentation check the DeepWiki.

What's included

VR Session & Head Tracking

(Part of webxr core)

Start and stop VR sessions from your event sheet. The VR Head Anchor behavior locks a GDevelop object to the player's headset each frame — your scene moves with the player automatically. Configure world scale (how many GDevelop units equal one real-world meter) to match any scene size.

Crouching is built in: use StartCrouching / StopCrouching to snap the player into a crouched posture — the physics body scales down uniformly, the camera drops to a configurable height, and everything attached (controllers, body zones, HUDs) shifts down together. StopCrouching checks clearance automatically: if there's a ceiling within standing-up range it stays crouched and vibrates both controllers to signal the head-bump.

Seated mode lets you set a fixed in-game player height with SetVirtualHeight: a physically-seated player appears at standing height in-game, with all VR elements correctly elevated. Both modes compose, so a seated player can still crouch in-game.

Performance: The extension automatically culls objects outside the headset's combined stereo view each frame, so objects behind the player or far off to the sides do not consume GPU time. A configurable safety margin keeps edge and near-camera objects from wrongly disappearing. You can tune or disable the culling from the event sheet.

Controller Tracking

(Part of webxr core)

Attach the VR Controller behavior to a 3D object to track either hand. Every frame you get:

  • Position and orientation in GDevelop world space
  • Trigger, grip, thumbstick, A/B/X/Y, and menu button states
  • Analog trigger and grip pressure (0–1)
  • Thumbstick axes for movement and rotation
  • Linear and angular velocity — useful for throw speed or melee swing damage
  • A targeting ray always cast from the controller for hit detection -- works even with the laser beam hidden. A configurable laser pointer visual beam overlays the same ray when enabled. Read hit distance and position in events to build UI selections, pistol aim, or aiming reticles

Physics-Based Grabbing

(Part of webxr core)

The VrGrabbable behavior lets players pick up, hold, and throw any 3D object. Features include:

  • Proximity grab — reach in and close your fist
  • Magnetic grab — point the laser, squeeze, and the object flies to your hand
  • Sticky grab — enable per-object so players click once to grab and click again to drop — no need to hold the grip button. A Force into hand action lets you spawn any grabbable directly into the player's grip from the event sheet.

Objects go kinematic while held (no physics fighting), and release restores normal physics with throw velocity. Configure hold offset and rotation per object to perfectly align weapons, tools, or props in the hand. Held objects track the controller with zero frame lag -- no trailing or stuttering even during fast head or body motion.

Holsters & Inventory

(Part of webxr core)

Keep items on the player's body with VrBodyZones and VrHolster:

  • VrBodyZones — up to 7 automatic holster slots anchored to the player: hip left/right, shoulder left/right, chest, head, and mouth. Hip, shoulder, and chest zones follow a deadzone-leashed virtual-torso heading driven by the headset, so physically turning in real life brings your holsters with you. Head and mouth zones follow the headset directly.
  • VrHolster — place a holster anywhere in the scene (on a wall, a table, a vehicle). Set MaxItems to hold multiple items (e.g. a quiver holding 3 arrows). Use StackOffset (X/Y/Z) to fan items out so they are visually distinct. Full holsters reject new items (they fall to the ground instead). Retrieval is last-in, first-out. Items can be grabbed by reaching for the item itself -- grip a sword by its blade, or pull one specific arrow from a quiver. Enable AllowMagneticRetrieval to also allow pulling items out with the laser from a distance (off by default to prevent accidental remote grabs).
  • Release an item near a zone and it snaps in with haptic feedback. Grip while inside the zone to retrieve it. Holstered items move in lockstep with their zone -- no one-frame lag between a body-zone holder and the items inside it.
  • Tag-based filtering: set which items each zone will accept.
  • Zone visibility options: always visible, visible only when holding a grabbable, visible only when the slot is empty, or hidden.

Archery System

(Part of webxr_archery)

A complete bow-and-arrow system ready to drop into any scene:

  • VrBow — hold and draw a bow with full haptic feedback and configurable draw distance and arrow speed.
  • VrArrow — full state machine: auto-nock, draw tracking, physics launch, flight rotation, and sticky arrow embedding on impact. Optional parabolic arc preview.
  • VrHittable — add to any arrow target to receive a one-frame JustHit condition that picks only the specific instance that was hit, plus hit speed and hit count for damage scaling.
  • Bowstring renders in real time and snaps back on release.

Levers, Sliders & Buttons

(Part of webxr core)

VrInteractable turns any object into a grabbable lever, slider, or button. Set the axis and range in the property editor; read the current value in events to drive doors, dials, or any game mechanic.

Point-and-Select

(Part of webxr core)

VrSelectable makes any object respond to the controller's laser ray or a physical touch. Use the IsSelected condition to highlight objects, open menus, or trigger any event-sheet action — no physics required. Ideal for in-game menus, interactive signs, and item tooltips.

VrTargetable detects when a controller ray is aimed at any 3D object, including non-grabbable targets, enemies, and props. IsTargeted picks the aimed-at instances each frame; JustTargeted fires once on aim entry; TargetingHand tells you left, right, or both; IsTargetedByHand(hand) is the preferred per-hand check for dual-wield -- it handles the "both lasers on one target" case correctly; and TargetPointX/Y/Z gives the precise hit location. The targeting ray is always cast when a controller is connected -- turning off the laser only hides the visual beam, so objects can be targeted with an invisible ray (useful for pistol aim, crosshairs, or any mechanic where you want hit detection without a visible beam). TargetingRayLength lets you set an independent reach for the targeting ray (0 = inherit laser length). Works alongside or independently of VrSelectable and VrGrabbable.

Climbing

(Part of webxr core)

VrClimbable lets players grip any surface and pull themselves up. Configure grab radius, launch scale on release, and mantle boost.

Doors

(Part of webxr_doors)

VrDoor adds rotating and sliding doors driven by the same physics-grab model used elsewhere in the extension. Define a hinge or rail axis, set travel limits, and the door integrates velocity from player pushes and handle grips with configurable friction. Doors latch automatically when they coast back to the closed position and re-open with a grip-in-handle action.

Lock/unlock via events or with a VrKey: drop a key object into the door's key zone and it snaps into the keyhole (only keys with matching tags dock), auto-unlocking the door if tags match and triggering IsKeyJustInserted and IsJustUnlocked edge conditions for sound effects and animations.

Teleportation

(Part of webxr_teleport)

VrTeleport fires a projectile arc from the controller and teleports the player to the landing point on release. Mark any surface as a valid landing zone with VrTeleportable. Add VrBlockTeleport to walls and obstacles to prevent the arc from passing through them -- players can no longer teleport into locked or closed-off areas, even if they reach the controller through the wall. Arc color, speed, and gravity are all tunable at runtime.

Floating Objects & HUDs

(Part of webxr core)

VrFollower keeps any object at a fixed offset from a target — useful for in-world HUDs, floating menus, wrist displays, or floating holsters around the player's body. Three rotation modes:

  • Follow the full controller or headset pose
  • Follow body yaw only (best for torso-relative HUDs)
  • Follow the real headset camera (best for face-mounted panels that track gaze)

Optional smoothing creates a floating, "lagging" feel for UI panels.

Locomotion

The extension pairs with GDevelop's built-in PhysicsCharacter3D for smooth movement:

InputAction
Left thumbstick up/down Move forward / backward
Left thumbstick left/right Strafe left / right
Right thumbstick X Smooth or snap yaw rotation
A button Jump
Left trigger (hold + release) Teleport arc

All thresholds and speeds are configured in the event sheet — no extension changes needed.

Virtual-torso yaw: The VR Head Anchor behavior maintains a single deadzone-leashed body heading (virtual torso) driven by the headset. This heading drives holsters, body-relative followers, and joystick movement all at once -- so physically turning in real life correctly reorients everything attached to your body with a natural rotation limit. Configurable deadzone and smoothing, with full selectable modes (Head / Controller / Off). All locomotion settings (mode, deadzone, smoothing, controller hand) can now be read and changed at runtime from the event sheet.

What are others saying?

"This is an absolutely insane development for GDevelop!"
@Queue The Game Dev
"It's insanely intuitive, well optimised and polished, to the point where it feels like a full official feature."
@cattymations

Requirements

  • GDevelop (latest recommended)
  • A WebXR-compatible browser (Chrome / Edge on PC, Meta Quest browser)
  • Any Meta Quest headset (Quest 2, 3, Pro) or other OpenXR-compatible device

Demo Project

A complete interactive demo scene showcasing every feature — grabbing, climbing, holsters, archery, doors, teleportation, selectable objects, and locomotion — is available as a paid add-on. It's a ready-to-run starting point you can modify and build on directly.

Dedicated to my beloved father who passed away during development of this extension.

Updated 2 days ago
Published 13 days ago
StatusReleased
CategoryTool
PlatformsHTML5
Rating
Rated 5.0 out of 5 stars
(1 total ratings)
AuthorAvram
Tagsgdevelop, meta-quest, Oculus Quest, quest, Virtual Reality (VR), webxr, xr
AI DisclosureAI Assisted, Code

Download

Download NowName your own price

Click download now to get access to the following files:

webxr.json 809 kB
webxr_teleport.json 64 kB
webxr_doors.json 158 kB
webxr_archery.json 264 kB
webxr_vr_demo_project.zip 19 MB
if you pay $9 USD or more

Development log

Comments

Log in with itch.io to leave a comment.

The display stutters when I turn with the right stick on Quest 3.

Can you record a video of it? How about when you physically turn in real world? Trying to figure out if it's up to stick or to rotation generally... I have a Quest 3S and haven't noticed anything like that.

(1 edit)

Btw, By any chance could you make this to work in Firefox as well as that's the main browser I and most of my friends use.

(+1)

I cannot add support for WebXR to Firefox if they do not support it. caniuse.com says FF doesn't support it: https://caniuse.com/?search=webxr

This is what Google AI results say about it (take it with a grain of salt):

Desktop Firefox does not natively support the WebXR Device API. While you can manually force the experimental dom.vr.webxr.enabled flag to true via about:config, to actually run immersive VR/AR experiences, you must either integrate a WebXR Polyfill or install the WebXR API Emulator add-on.

Some feedback when I tried this one out.
First my rig  info.
R7 9800x3d
RX9070 XT
Oculus Rift S
1. When you put something on your head slot when crouching it detects that as an obstacle and won't let you stand up anymore.
2. There is weird stuttering happening like it shows the previous and next image on top of eachother.
3. It takes the initial controller orientation where they are at the moment you open up the game, in my case if I have them on the table and start the game and pick them up they are upside down and pointing to an arbitary direction
4. Quite often when you put an item on your shoulder or head slot the items seem to disappear or set them at incorrect position like behind the head instead of shoulder.
Otherwise you've done a fantastic work <3

(+1)

Thank you for your feedback! Let's address each of your points separately:

  1. Legit bug, I'll add it to my Trello board
  2. Can you record a video of that? Really interested to see what's going on.
  3. I'll have to try this with my headset as (up until now) I would already be holding them when I start the game.
  4. That's what hang pose is for. Similarly to hold pose, you can set hang pose  (X/Y/Z offset and rotation) for each object in their VrGrabbable behavior properties (advanced section). But anyway you need to put your hand in the body zone (sphere) in order to grab the object from it - wherever the object is rendered.

A little hint: You can also switch to the "toolshed" scene  (if you bought the demo project) and import your object into it (add VrGrabbable to it and add the model to the group where all grabbables are). When you pick up an object, your left stick movement will no more control your in-game movement and will turn to hold pose adjustments (should be able to use it for hang pose too). Your left thumbstick adjusts X/Y offset and X/Y buttons adjust Z offset. Holding trigger switches to adjusting rotation along the same axes (thumbstick -> X/Y rotation; X/Y buttons -> Z rotation). An in-your-face 3D HUD text will show current numbers. Copy them to your object in the editor to have your initial hold/hang pose set. 

I will buy the demo once I have some extra money.
Looking forward for the shed ;)
I'll make the video of the stuttering too at some point and send it to you in Discord.

Yoink, bought it now <3

One issue is that the climbing makes your hand violently shake and it just gives me a headache.

Yeah, it's a bit glitchy, I'll see what I can do about it. Thanks for reporting

Your welcome