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 up-to-date documentation and detailed architecture, check the DeepWiki.

What's included

VR Session & Head Tracking

(Part of webxr core)

Start and stop VR sessions from your event sheet. The VrHeadAnchor 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 VrController 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 and shoulder zones follow body yaw; head and mouth zones follow the headset.
  • 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.
  • 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 above the player's waist. 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.

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.

Published 15 hours ago
StatusReleased
CategoryTool
PlatformsHTML5
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 774 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

Leave a comment

Log in with itch.io to leave a comment.