From familiar Unity to XR Pioneer: Why Godot?
WHY??? Because while Unity might seem easier initially, their closed-source model and post-Riccitiello community exodus made Godot our clear choice. As CTO/CDO of weltfern, I've spent intensive time leading development of Assemble! - a groundbreaking XR puzzle game built with Godot 4. Based on these experiences, I believe that Godot is well suited for professional XR development:
- Jolt Physics integration for realistic interactions
- Dynamic GLTF loading system with adaptive difficulty
- Custom XR interaction systems built on Godot XR Tools (Open Source)
Experiencing Godot: What I've Learned
Before digging into the technical details, I have a few personal reflections from the development of Assemble! Throughout the project, I faced a number of challenges that pushed me out of my comfort zone, ranging from grappling with Godot's novel XR paradigms to solving unforeseen performance bottlenecks during development. These challenges weren't just technical hurdles-they were opportunities to grow both professionally and personally.
More than just a technical guide, this post reflects the passion, persistence, and never-ending quest for innovation that has defined my career in XR development. I hope that sharing these insights and personal experiences will inspire others to embrace the challenges and begin their own journeys in the evolving world of immersive technologies.
Godot's XR Evolution: 2024 Breakthroughs
1. Horizon Store Early Access
Godot's new native Horizon Store version revolutionizes XR workflows:
- Use Godot in XR to run your Game (Meta Quest 3 above)
- Built-in performance validation for XR content
- Test shaders and shading on the device
- One-click import of optimized 3D models

During the development of Assemble! I was only able to use the Godot version from the Horizon store at the very end because it did not exist when we started. Until the very end, the idea was to get native performance for the Quest 2, so I worked mainly with that device. Running Godot as a complete engine on a Quest 2 doesn't technically work at all!
2. Essential XR Tools
Godot's XR Tools framework enforces best practices from the XR Design Handbook:
- Comfort Modes: Built-in teleportation snap turns + movement vignetting
- Static Reference Points: Persistent UI elements + ground plane anchors
- Gradual Acceleration: Configurable arm swing/world grab thresholds
- Adaptive Rendering: Automatic LOD scaling during intense motion
# Enabling comfort mode in XR Tools
func _ready():
$XRController.movement_mode = XRConstants.MOVEMENT_TELEPORT
$XRController.snap_turn_degrees = 30
$XRController.vignette_strength = 0.7
Performance: Lessons from the Trenches
Critical Optimization Strategies
- Asset Discipline
- Keep poly counts < 100k per scene
- Use 2048x2048 textures max
- Disable glow/postprocessing features in VR
- Debugging Essentials
# Enable performance monitors
Engine.set_iterations_per_second(90)
Engine.set_physics_jitter_fix(0.8)
- XR-Specific Tweaks
- 72Hz refresh rate minimum
- MSAA 2x + FSR upscaling
- Aggressive LOD management
Meeting Meta Horizon's Rigorous Standards
Godot Alternatives to Unity's OVR Metrics
While Meta's OVR Metrics Tool is Unity-specific, Godot offers comparable solutions:
Unity Metric | Godot Equivalent | Ideal Value |
---|---|---|
CPU Time | Performance.get_monitor(Performance.TIME_PROCESS) | <11ms |
GPU Time | Performance.get_monitor(Performance.TIME_FPS) | <8ms |
Draw Calls | Performance.get_monitor(Performance.RENDER_DRAW_CALLS) | <150 |
Triangles | Performance.get_monitor(Performance.RENDER_PRIMITIVES_IN_FRAME) | <100k |
# Continuous performance monitoring
func _process(delta):
var cpu_time = Performance.get_monitor(Performance.TIME_PROCESS)
var gpu_time = Performance.get_monitor(Performance.TIME_FPS)
if cpu_time > 11 || gpu_time > 8:
$OptimizationAlert.trigger()
Although performance is an issue when planning a game, it cannot be evaluated from the code written. For this reason, it is always important to pay attention to this issue during the development process. The only way to do this is to closely observe the game as it runs on the device and examine what factors are at play.
In the case of Assemble!, it was the day/night cycle shaders on the one hand, and the many parts on the other, that had a massive impact on performance. Of course, the physics, which was handled exclusively by Jolt, also played a role. But in the end we had to work hard on the number of polygons and shaders.
Horizon Store Submission Checklist
Based on Meta's VRC Requirements:
- ✅ Frame Rate: Lock to 72/90Hz using Engine.iterations_per_second
- ✅ Memory: <1.5GB RAM via OS.get_static_memory_usage()
- ✅ Thermals: Monitor via Performance.get_monitor
(Performance.OBJECT_COUNT) - ✅ Content Scale: Use ProjectSettings.set_setting
("rendering/limits/time/frame_delay_msec", 16)
flowchart LR
A[Start] --> B{Frame Time <13ms?}
B -->|Yes| C[Check Memory]
B -->|No| D[Optimize Assets & Shaders]
C --> E{<1.5GB?}
E -->|Yes| F[Submit!]
E -->|No| G[Reduce Textures]
Similar to Godot on the Quest 3, Meta's Horizon Store was released during Assemble! This meant that all titles previously in the AppLab were "supposedly" dumped directly onto the interface.
WRONG THOUGHT - the guidelines were massively increased, making it extremely difficult to get into the store and sell quickly.
My recommendation here, as with performance, is to release the first and simplest version (MVP) and test the whole thing with a selected group first. It is important not to underestimate the amount of work involved with documents, legal issues, and ultimately just understanding the feedback from the review team. In the end, I started literally asking explicitly WHAT EXACTLY is meant by the feedback as an extra note. This drastically reduced the amount of wild interpretation.
Pro Tips for XR Devs
- Start with Godot's XR Setup Guide
- Adopt the Improved XR Start Script
- Profile early/often using Godot Performance Graphs
The Future of Godot XR
With Meta's official Godot support and the editor's full XR capabilities:
- Develop directly in VR/AR
- Live-edit scenes while testing
- Access documentation in-headset
Be sure to take advantage of the help available. The Godot community can be extremely helpful and useful to you to support your game, be it XR or otherwise, in every phase!!!
Ready to start your XR journey? 🎮 Download Godot | Checkout the mentioned Assemble! Portfolio Post
Ingmar Konnow