XR-Spielentwicklung in Godot meistern: Lektionen aus „Assemble!"
Was die Godot-Produktion eines XR-Spiels ausmacht — von Physik über Performance bis zur Horizon-Store-Review. Mit den APIs und dem Stand von Godot 4.6.
Als CTO von weltfern habe ich die Entwicklung von Assemble! geleitet — einem XR-Puzzlespiel, gebaut mit Godot 4 und inzwischen im Meta Horizon Store. Dieser Beitrag sammelt die Lektionen daraus: Warum Godot, wie die Performance auf Quest-Hardware gelingt und was die Store-Einreichung wirklich kostet. Die technischen Angaben sind auf den Stand von Godot 4.6 gezogen — die ursprüngliche Fassung enthielt einige API-Fehler, die jetzt korrigiert sind.
Von Unity zu Godot: Warum der Wechsel?
Unity wäre der einfachere Weg gewesen — aber das Closed-Source-Modell und der Exodus der Community nach der Runtime-Fee-Debatte unter John Riccitiello haben Godot zur klaren Wahl gemacht. Nach der intensiven Assemble!-Produktion stehe ich zu dem Urteil: Godot eignet sich für professionelle XR-Entwicklung. Was uns überzeugt hat:
- Jolt Physics-Integration für realistische Interaktionen — mittlerweile auch im Web-Export
- Dynamisches GLTF-Lade-System mit adaptiver Schwierigkeit
- Eigene XR-Interaktionssysteme auf Basis von Godot XR Tools (Open Source)
Persönliche Erfahrung: Mehr als ein technischer Guide
Vor den Details eine ehrliche Notiz: Assemble! hat mich mehrfach aus der Komfortzone geholt — von Godots XR-Paradigmen bis zu Performance-Engpässen, die sich erst auf dem Gerät zeigten. Diese Hürden waren keine bloßen Bugfixlisten, sondern der eigentliche Lernzuwachs des Projekts.
Godot XR: Die Evolution seit 2024
Der Godot-Editor im Horizon Store
Seit Dezember 2024 gibt es den Godot-Editor nativ im Horizon Store — XR-Workflows komplett auf dem Headset:
- Spiel direkt in XR auf dem Quest-Headset laufen lassen (Quest 3 aufwärts — auf der Quest 2 läuft der Editor technisch nicht)
- Shader und Shading auf dem echten Gerät testen
- Performance-Validierung ohne PC-Umweg

Bei Assemble! kam die Store-Version zu spät — wir begannen vor ihrer Veröffentlichung und arbeiteten bis zuletzt auf der Quest 2. Heute würde ich sofort auf dem Headset iterieren.
XR Tools und Komfort-Standards
Das XR-Tools-Framework setzt die Best Practices aus dem XR Design Handbook um — Teleport-Locomotion, Snap-Turns, Bewegungs-Vignette, statische Referenzpunkte. Die Komfort-Optionen werden in XR Tools über Nodes im Player-Rig konfiguriert (Movement-Turn mit Snap-Modus, Vignette-Stärke u. a.), nicht über eine einzelne API.
Die Initialisierung sieht im Kern so aus (Pattern aus dem offiziellen „Better XR Start Script"):
var xr_interface := XRServer.find_interface("OpenXR") as OpenXRInterface
if xr_interface and xr_interface.is_initialized():
DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_DISABLED)
get_viewport().use_xr = true
# Ziel-Refreshrate auf dem Headset setzen (Quest: 72/80/90 Hz)
if 90.0 in xr_interface.get_available_display_refresh_rates():
xr_interface.display_refresh_rate = 90.0
Performance: Lektionen aus dem Trench
Asset-Disziplin
- Polygone unter ~100k pro Szene halten
- Texturen maximal 2048×2048
- Glow/Postprocessing in VR deaktivieren — das frisst das Budget auf Mobile-Hardware
Monitoring — mit den richtigen Monitoren
Ein Hinweis zur Ehrlichkeit: Die ursprüngliche Fassung dieses Posts nannte Performance.TIME_FPS als „GPU-Zeit" — falsch, der Monitor liefert die Bildrate, nicht Millisekunden. Eine echte GPU-Zeit liefert Godot nicht als Monitor; auf dem Quest misst man sie mit dem OVR-Metrics-Overlay (siehe unten). Was in Godot 4 korrekt funktioniert:
func _process(_delta):
var fps := Performance.get_monitor(Performance.TIME_FPS)
var cpu_ms := Performance.get_monitor(Performance.TIME_PROCESS) * 1000.0
var draws := Performance.get_monitor(Performance.RENDER_TOTAL_DRAW_CALLS_IN_FRAME)
var tris := Performance.get_monitor(Performance.RENDER_TOTAL_PRIMITIVES_IN_FRAME)
if cpu_ms > 11.0 or fps < 72.0:
$OptimizationAlert.trigger()
| Metrik | Godot-4-Monitor | Richtwert Quest |
|---|---|---|
| Bildrate | Performance.TIME_FPS | ≥ 72/90 FPS |
| CPU-Framezeit | Performance.TIME_PROCESS | < 11 ms |
| Draw Calls | Performance.RENDER_TOTAL_DRAW_CALLS_IN_FRAME | < 150 |
| Dreiecke | Performance.RENDER_TOTAL_PRIMITIVES_IN_FRAME | < 100k |
| Statischer Speicher | Performance.MEMORY_STATIC | so niedrig wie möglich |
Performance lässt sich nicht am Code ablesen — sie muss auf dem Gerät beobachtet werden. Bei Assemble! waren es am Ende die Tag/Nacht-Zyklus-Shader und die schiere Teilezahl, die massiv ins Budget fraßen; die Jolt-Physik spielte mit hinein. Gekämpft haben wir letztlich um Polygonzahl und Shader.
Die Meta-Horizon-Standards erfüllen
Eine Korrektur aus der ersten Fassung: Das OVR Metrics Tool ist kein Unity-Exklusivwerkzeug — es ist ein Overlay-APK, das systemweit auf der Quest läuft und damit auch Godot-Builds misst (FPS, CPU-/GPU-Last, Thermik). Für das Store-Review also direkt nutzbar, keine Godot-Umwege nötig.
Auf Basis von Metas VRC-Requirements hat sich diese Checkliste bewährt:
- Framerate stabil auf der Zielrate halten (72/90 Hz via
display_refresh_rate) - Speicherbedarf im Blick — via
Performance.MEMORY_STATIC(nicht mehr über die Godot-3-APIOS.get_static_memory_usage()); Achtung: liefert nur in Debug-Builds Werte, im Release-Export hilft OVR Metrics - Thermik und Frametimes über längere Sessions prüfen, nicht nur im ersten Level
- Früh auf Referenz-Hardware testen — heute ist das die Quest 3S, nicht mehr die eingestellte Quest 2


B{Framerate stabil
72/90 Hz?}
B -->|Nein| C[Assets &<br/>Shader optimieren]
C --> B
B -->|Ja| D{Speicher &<br/>Thermik ok?}
D -->|Nein| E[Texturen &<br/>Objekte reduzieren]
E --> B
D -->|Ja| F[VRC-Checkliste<br/>durchgehen]
F --> G[Submit]
-->
Die Store-Realität: MVP zuerst
Während Assemble! in Arbeit war, hat Meta den App Lab in den Horizon Store überführt — alle bisherigen Titel landeten vermeintlich direkt im Shop. Falsch gedacht: Die Richtlinien wurden massiv verschärft, und der schnelle Weg in den Store war Geschichte.
Meine Empfehlung: die erste, einfachste Version (MVP) einreichen und mit einer ausgewählten Testgruppe prüfen. Der Aufwand für Dokumente, rechtliche Nachweise und schlicht das Verstehen des Review-Feedbacks wird unterschätzt. Am Ende habe ich wörtlich nachgefragt, WAS GENAU mit dem Feedback gemeint ist — als eigene Notiz im Ticket. Das hat die wilde Interpretationsarbeit drastisch reduziert.
Stand September 2026
Die Werkzeugkette hat sich seit Erscheinen deutlich weiterentwickelt:
- Godot 4.6 (stable seit Januar 2026, aktuell 4.6.3) ist in die Polish-Phase eingetreten: Performance-Optimierung, engere Standard-Integration, weniger Bruchkanten.
- XR Tools 4.5.1 (Dezember 2025) — aktuelles Release, setzt Godot 4.4+ voraus; u. a. verbesserte Pickables, Grab-Points und Viewport2Din3D-Performance.
- OpenXR Vendors Plugin 5.x — die Versionsschiene für Godot 4.6; das im Originaltext genannte 3.1.2 ist überholt.
- Godot Meta Toolkit: GDExtension mit Platform-SDK-Anbindung (IAP, Achievements, Leaderboards), Meta XR Simulator zum Testen ohne Headset und automatischer Export-Konfiguration für Quest.
- Hardware-Basis: Quest 3S als Referenz für die Entwicklung; die Quest 2 ist aus dem Verkauf (Sicherheitsupdates bis Dezember 2027).
Pro-Tipps für XR-Entwicklung mit Godot
- Mit dem offiziellen XR-Setup-Guide starten
- Das dokumentierte Better XR Start Script als Basis übernehmen
- Früh und oft profilen — auf dem Gerät, nicht im Editor
- Die Godot-Community nutzen — sie ist in jeder Projektphase hilfreich
Fazit
Mit Metas offizieller Unterstützung und dem Editor im Headset ist Godot für XR keine Nischenwahl mehr. Assemble! hat gezeigt: Die Kombination aus Jolt-Physik, XR Tools und disziplinierter Performance-Arbeit trägt ein kommerzielles Quest-Spiel bis in den Store. Wer dieselbe Strecke plant, findet die Spielseite des Projekts im Assemble!-Beitrag — und die größten Zeitfresser lauern weiterhin in Shadern, Polygonzahl und Store-Bürokratie.
Update September 2026: Dieser Artikel wurde überarbeitet — auf Godot 4.6/XR Tools 4.5.1/Vendors 5.x aktualisiert, API-Fehler korrigiert (Godot-4-Monitor-Namen, display_refresh_rate statt iterations_per_second, MEMORY_STATIC statt OS.get_static_memory_usage()), OVR-Metrics-Einordnung richtiggestellt und das Mermaid-Flowchart als Bild umgesetzt.
Quellen
- Godot Editor — Horizon Store Early Access Release — Godot Engine (2024)
- Godot XR update — February 2025 — Godot Engine (2025)
- Godot XR Tools Releases — GodotVR, GitHub (2025)
- Godot OpenXR Vendors Releases — GodotVR, GitHub (2026)
- Godot Meta Toolkit — GitHub-Repository
- OVR Metrics Tool — Meta Horizon OS Developers
- VRC Requirements — Performance — Meta Horizon OS Developers
Wer ein Godot-XR-Projekt Richtung Quest-Store bringen will oder bei der Performance-Optimierung festhängt: Nachricht an ingmar@konnow.de oder über LinkedIn — ich habe diese Strecke komplett durchgespielt.