is godot "battle ready" for vr?

Godot Version

4.2.2

Question

Hi I am new to Godot and so far I like it a lot: I tried the latest xrtools demo and I am impressed, however there are some issues here and there which made me wonder if I should stick with it to build a small quest vr game or if I should wait some more time until it’s more “stable”.

These are the issues I’ve had with xrtools demo 4.4.0:

  • a bunch of errors/warnings the first time I load the demo project (reported below)
  • objects flickering as if they are not finding the right place on the table,
  • the player collision that gets between my hands and the objects I am trying to take from the table pushing me back
    There might be other stuff, but I was testing the bits I wanted to implement later on.

I know that Godot is open source and that with time everything might change, I just wanted an “insider” opinion before digging in for real. I am coming from 2d game development, therefore I already have my issues learning a bunch of new stuff :slight_smile:

Thank you

Godot Engine v4.2.2.stable.official (c) 2007-present Juan Linietsky, Ariel Manzur & Godot Contributors.
--- Debug adapter server started ---
--- GDScript language server started on port 6005 ---
  Failed to create an autoload, script 'res://addons/godot-xr-tools/user_settings/user_settings.gd' does not inherit from 'Node'.
  editor/editor_autoload_settings.cpp:550 - Condition "!info->node" is true. Continuing.
  Failed to create an autoload, script 'res://addons/godot-xr-tools/rumble/rumble_manager.gd' does not inherit from 'Node'.
  editor/editor_autoload_settings.cpp:550 - Condition "!info->node" is true. Continuing.
Add Autoload
  modules/gdscript/gdscript.cpp:2069 - Condition "!named_globals.has(p_name)" is true.
  modules/gdscript/gdscript.cpp:2069 - Condition "!named_globals.has(p_name)" is true.
  Failed to create an autoload, script 'res://addons/godot-xr-tools/user_settings/user_settings.gd' does not inherit from 'Node'.
  editor/editor_autoload_settings.cpp:550 - Condition "!info->node" is true. Continuing.
  Failed to create an autoload, script 'res://addons/godot-xr-tools/rumble/rumble_manager.gd' does not inherit from 'Node'.
  editor/editor_autoload_settings.cpp:550 - Condition "!info->node" is true. Continuing.
Add Autoload
  scene/resources/importer_mesh.cpp:518 - Ignoring face with non-finite normal in LOD generation.
  scene/main/node.cpp:1427 - Adding 'mesh_Glove_L' as child to 'Skeleton3D' will make owner 'Hand_Glove_L' inconsistent. Consider unsetting the owner beforehand.
  scene/main/node.cpp:1427 - Adding 'mesh_Glove_low_L' as child to 'Skeleton3D' will make owner 'Hand_Glove_low_L' inconsistent. Consider unsetting the owner beforehand.
  scene/main/node.cpp:1427 - Adding 'mesh_Glove_low_R' as child to 'Skeleton3D' will make owner 'Hand_Glove_low_R' inconsistent. Consider unsetting the owner beforehand.
  scene/main/node.cpp:1427 - Adding 'mesh_Glove_R' as child to 'Skeleton3D' will make owner 'Hand_Glove_R' inconsistent. Consider unsetting the owner beforehand.
  scene/main/node.cpp:1427 - Adding 'mesh_Hand_L' as child to 'Skeleton3D' will make owner 'hand_l' inconsistent. Consider unsetting the owner beforehand.
  scene/main/node.cpp:1427 - Adding 'mesh_Hand_low_L' as child to 'Skeleton3D' will make owner 'Hand_low_L' inconsistent. Consider unsetting the owner beforehand.
  scene/main/node.cpp:1427 - Adding 'mesh_Hand_low_R' as child to 'Skeleton3D' will make owner 'Hand_low_R' inconsistent. Consider unsetting the owner beforehand.
  scene/main/node.cpp:1427 - Adding 'mesh_Hand_Nails_L' as child to 'Skeleton3D' will make owner 'Hand_Nails_L' inconsistent. Consider unsetting the owner beforehand.
  scene/main/node.cpp:1427 - Adding 'mesh_Hand_Nails_low_L' as child to 'Skeleton3D' will make owner 'Hand_Nails_low_L' inconsistent. Consider unsetting the owner beforehand.
  scene/main/node.cpp:1427 - Adding 'mesh_Hand_Nails_low_R' as child to 'Skeleton3D' will make owner 'Hand_Nails_low_R' inconsistent. Consider unsetting the owner beforehand.
  scene/main/node.cpp:1427 - Adding 'mesh_Hand_Nails_R' as child to 'Skeleton3D' will make owner 'Hand_Nails_R' inconsistent. Consider unsetting the owner beforehand.
  scene/main/node.cpp:1427 - Adding 'mesh_Hand_R' as child to 'Skeleton3D' will make owner 'hand_r' inconsistent. Consider unsetting the owner beforehand.
  res://addons/godot-xr-tools/player/player_body.gd:453 - Compile Error: Identifier not found: XRToolsUserSettings
  modules/gdscript/gdscript.cpp:2726 - Failed to load script "res://addons/godot-xr-tools/player/player_body.gd" with error "Compilation failed". (User)
  res://addons/godot-xr-tools/player/player_body.gd:453 - Compile Error: Identifier not found: XRToolsUserSettings
  res://addons/godot-xr-tools/functions/movement_provider.gd:-1 - Compile Error: 
  res://addons/godot-xr-tools/player/player_body.gd:453 - Compile Error: Identifier not found: XRToolsUserSettings
  res://addons/godot-xr-tools/examples/fall_damage.gd:-1 - Compile Error: 
  modules/gdscript/gdscript.cpp:2726 - Failed to load script "res://addons/godot-xr-tools/examples/fall_damage.gd" with error "Compilation failed". (User)
  res://addons/godot-xr-tools/player/player_body.gd:453 - Compile Error: Identifier not found: XRToolsUserSettings
  res://addons/godot-xr-tools/functions/function_teleport.gd:-1 - Compile Error: 
  modules/gdscript/gdscript.cpp:2726 - Failed to load script "res://addons/godot-xr-tools/functions/function_teleport.gd" with error "Compilation failed". (User)
  res://addons/godot-xr-tools/player/player_body.gd:453 - Compile Error: Identifier not found: XRToolsUserSettings
  res://addons/godot-xr-tools/functions/movement_climb.gd:-1 - Compile Error: 
  modules/gdscript/gdscript.cpp:2726 - Failed to load script "res://addons/godot-xr-tools/functions/movement_climb.gd" with error "Compilation failed". (User)
  res://addons/godot-xr-tools/player/player_body.gd:453 - Compile Error: Identifier not found: XRToolsUserSettings
  res://addons/godot-xr-tools/functions/movement_crouch.gd:-1 - Compile Error: 
  modules/gdscript/gdscript.cpp:2726 - Failed to load script "res://addons/godot-xr-tools/functions/movement_crouch.gd" with error "Compilation failed". (User)
  res://addons/godot-xr-tools/functions/movement_direct.gd:44 - Compile Error: Identifier not found: XRToolsUserSettings
  modules/gdscript/gdscript.cpp:2726 - Failed to load script "res://addons/godot-xr-tools/functions/movement_direct.gd" with error "Compilation failed". (User)
  res://addons/godot-xr-tools/player/player_body.gd:453 - Compile Error: Identifier not found: XRToolsUserSettings
  res://addons/godot-xr-tools/functions/movement_flight.gd:-1 - Compile Error: 
  modules/gdscript/gdscript.cpp:2726 - Failed to load script "res://addons/godot-xr-tools/functions/movement_flight.gd" with error "Compilation failed". (User)
  res://addons/godot-xr-tools/player/player_body.gd:453 - Compile Error: Identifier not found: XRToolsUserSettings
  res://addons/godot-xr-tools/functions/movement_footstep.gd:-1 - Compile Error: 
  modules/gdscript/gdscript.cpp:2726 - Failed to load script "res://addons/godot-xr-tools/functions/movement_footstep.gd" with error "Compilation failed". (User)
  res://addons/godot-xr-tools/player/player_body.gd:453 - Compile Error: Identifier not found: XRToolsUserSettings
  res://addons/godot-xr-tools/functions/movement_glide.gd:-1 - Compile Error: 
  modules/gdscript/gdscript.cpp:2726 - Failed to load script "res://addons/godot-xr-tools/functions/movement_glide.gd" with error "Compilation failed". (User)
  res://addons/godot-xr-tools/player/player_body.gd:453 - Compile Error: Identifier not found: XRToolsUserSettings
  res://addons/godot-xr-tools/functions/movement_grapple.gd:-1 - Compile Error: 
  modules/gdscript/gdscript.cpp:2726 - Failed to load script "res://addons/godot-xr-tools/functions/movement_grapple.gd" with error "Compilation failed". (User)
  res://addons/godot-xr-tools/player/player_body.gd:453 - Compile Error: Identifier not found: XRToolsUserSettings
  res://addons/godot-xr-tools/functions/movement_jog.gd:-1 - Compile Error: 
  modules/gdscript/gdscript.cpp:2726 - Failed to load script "res://addons/godot-xr-tools/functions/movement_jog.gd" with error "Compilation failed". (User)
  res://addons/godot-xr-tools/player/player_body.gd:453 - Compile Error: Identifier not found: XRToolsUserSettings
  res://addons/godot-xr-tools/functions/movement_jump.gd:-1 - Compile Error: 
  modules/gdscript/gdscript.cpp:2726 - Failed to load script "res://addons/godot-xr-tools/functions/movement_jump.gd" with error "Compilation failed". (User)
  res://addons/godot-xr-tools/player/player_body.gd:453 - Compile Error: Identifier not found: XRToolsUserSettings
  res://addons/godot-xr-tools/functions/movement_physical_jump.gd:-1 - Compile Error: 
  modules/gdscript/gdscript.cpp:2726 - Failed to load script "res://addons/godot-xr-tools/functions/movement_physical_jump.gd" with error "Compilation failed". (User)
  res://addons/godot-xr-tools/functions/movement_direct.gd:44 - Compile Error: Identifier not found: XRToolsUserSettings
  res://addons/godot-xr-tools/player/player_body.gd:453 - Compile Error: Identifier not found: XRToolsUserSettings
  res://addons/godot-xr-tools/functions/movement_sprint.gd:-1 - Compile Error: 
  modules/gdscript/gdscript.cpp:2726 - Failed to load script "res://addons/godot-xr-tools/functions/movement_sprint.gd" with error "Compilation failed". (User)
  res://addons/godot-xr-tools/functions/movement_turn.gd:111 - Compile Error: Identifier not found: XRToolsUserSettings
  modules/gdscript/gdscript.cpp:2726 - Failed to load script "res://addons/godot-xr-tools/functions/movement_turn.gd" with error "Compilation failed". (User)
  res://addons/godot-xr-tools/player/player_body.gd:453 - Compile Error: Identifier not found: XRToolsUserSettings
  res://addons/godot-xr-tools/functions/movement_wall_walk.gd:-1 - Compile Error: 
  modules/gdscript/gdscript.cpp:2726 - Failed to load script "res://addons/godot-xr-tools/functions/movement_wall_walk.gd" with error "Compilation failed". (User)
  res://addons/godot-xr-tools/player/player_body.gd:453 - Compile Error: Identifier not found: XRToolsUserSettings
  res://addons/godot-xr-tools/functions/movement_wind.gd:-1 - Compile Error: 
  modules/gdscript/gdscript.cpp:2726 - Failed to load script "res://addons/godot-xr-tools/functions/movement_wind.gd" with error "Compilation failed". (User)
  res://addons/godot-xr-tools/player/player_body.gd:453 - Compile Error: Identifier not found: XRToolsUserSettings
  res://addons/godot-xr-tools/functions/movement_world_grab.gd:-1 - Compile Error: 
  modules/gdscript/gdscript.cpp:2726 - Failed to load script "res://addons/godot-xr-tools/functions/movement_world_grab.gd" with error "Compilation failed". (User)
  res://addons/godot-xr-tools/player/player_body.gd:453 - Compile Error: Identifier not found: XRToolsUserSettings
  res://addons/godot-xr-tools/objects/teleport_area.gd:-1 - Compile Error: 
  modules/gdscript/gdscript.cpp:2726 - Failed to load script "res://addons/godot-xr-tools/objects/teleport_area.gd" with error "Compilation failed". (User)
  res://addons/godot-xr-tools/rumble/rumbler.gd:19 - Compile Error: Identifier not found: XRToolsRumbleManager
  modules/gdscript/gdscript.cpp:2726 - Failed to load script "res://addons/godot-xr-tools/rumble/rumbler.gd" with error "Compilation failed". (User)
  res://addons/godot-xr-tools/user_settings/user_settings_ui.gd:14 - Compile Error: Identifier not found: XRToolsUserSettings
  modules/gdscript/gdscript.cpp:2726 - Failed to load script "res://addons/godot-xr-tools/user_settings/user_settings_ui.gd" with error "Compilation failed". (User)
  res://addons/godot-xr-tools/player/player_body.gd:453 - Compile Error: Identifier not found: XRToolsUserSettings
  res://assets/meshes/control_pad/control_pad_display.gd:-1 - Compile Error: 
  modules/gdscript/gdscript.cpp:2726 - Failed to load script "res://assets/meshes/control_pad/control_pad_display.gd" with error "Compilation failed". (User)
  res://scenes/demo_scene_base.gd:9 - Compile Error: Identifier not found: XRToolsUserSettings
  res://scenes/main_menu/main_menu_level.gd:-1 - Compile Error: 
  modules/gdscript/gdscript.cpp:2726 - Failed to load script "res://scenes/main_menu/main_menu_level.gd" with error "Compilation failed". (User)
  res://scenes/rumble_demo/objects/rumble_area.gd:26 - Compile Error: Identifier not found: XRToolsRumbleManager
  modules/gdscript/gdscript.cpp:2726 - Failed to load script "res://scenes/rumble_demo/objects/rumble_area.gd" with error "Compilation failed". (User)
  res://scenes/rumble_demo/rumble_on_button.gd:24 - Compile Error: Identifier not found: XRToolsRumbleManager
  modules/gdscript/gdscript.cpp:2726 - Failed to load script "res://scenes/rumble_demo/rumble_on_button.gd" with error "Compilation failed". (User)
  Expected Image data size of 925x100x1 (DXT5 RGBA8 with 9 mipmaps) = 125536 bytes, got 125552 bytes instead.
  drivers/gles3/storage/texture_storage.cpp:989 - Condition "image->is_empty()" is true. Returning: Ref<Image>()
  Expected Image data size of 465x60x1 (DXT1 RGB8 with 8 mipmaps) = 19048 bytes, got 19144 bytes instead.
  drivers/gles3/storage/texture_storage.cpp:989 - Condition "image->is_empty()" is true. Returning: Ref<Image>()
  Expected Image data size of 671x64x1 (DXT1 RGB8 with 9 mipmaps) = 28744 bytes, got 28752 bytes instead.
  drivers/gles3/storage/texture_storage.cpp:989 - Condition "image->is_empty()" is true. Returning: Ref<Image>()
  Expected Image data size of 677x75x1 (DXT1 RGB8 with 9 mipmaps) = 35056 bytes, got 35080 bytes instead.
  drivers/gles3/storage/texture_storage.cpp:989 - Condition "image->is_empty()" is true. Returning: Ref<Image>()
  Expected Image data size of 671x64x1 (DXT1 RGB8 with 9 mipmaps) = 28744 bytes, got 28752 bytes instead.
  drivers/gles3/storage/texture_storage.cpp:989 - Condition "image->is_empty()" is true. Returning: Ref<Image>()
  Expected Image data size of 497x70x1 (DXT1 RGB8 with 8 mipmaps) = 24088 bytes, got 24328 bytes instead.
  drivers/gles3/storage/texture_storage.cpp:989 - Condition "image->is_empty()" is true. Returning: Ref<Image>()
  Expected Image data size of 594x67x1 (DXT1 RGB8 with 9 mipmaps) = 27320 bytes, got 27656 bytes instead.
  drivers/gles3/storage/texture_storage.cpp:989 - Condition "image->is_empty()" is true. Returning: Ref<Image>()
  Expected Image data size of 665x64x1 (DXT1 RGB8 with 9 mipmaps) = 28552 bytes, got 28616 bytes instead.
  drivers/gles3/storage/texture_storage.cpp:989 - Condition "image->is_empty()" is true. Returning: Ref<Image>()
  Expected Image data size of 414x60x1 (DXT1 RGB8 with 8 mipmaps) = 16960 bytes, got 16968 bytes instead.
  drivers/gles3/storage/texture_storage.cpp:989 - Condition "image->is_empty()" is true. Returning: Ref<Image>()
  Expected Image data size of 465x60x1 (DXT1 RGB8 with 8 mipmaps) = 19048 bytes, got 19144 bytes instead.
  drivers/gles3/storage/texture_storage.cpp:989 - Condition "image->is_empty()" is true. Returning: Ref<Image>()
  Expected Image data size of 766x66x1 (DXT1 RGB8 with 9 mipmaps) = 35144 bytes, got 35528 bytes instead.
  drivers/gles3/storage/texture_storage.cpp:989 - Condition "image->is_empty()" is true. Returning: Ref<Image>()
  Expected Image data size of 766x66x1 (DXT1 RGB8 with 9 mipmaps) = 35144 bytes, got 35528 bytes instead.
  drivers/gles3/storage/texture_storage.cpp:989 - Condition "image->is_empty()" is true. Returning: Ref<Image>()
  Expected Image data size of 553x68x1 (DXT1 RGB8 with 9 mipmaps) = 25712 bytes, got 25784 bytes instead.
  drivers/gles3/storage/texture_storage.cpp:989 - Condition "image->is_empty()" is true. Returning: Ref<Image>()

IMO yes. It does have its limitations though so it depends on the type of game you are making. Particularly for standalone xr, performance with lots of shadows and lights and transparency is apparently less than other engines but if you are making a stylised game that doesn’t matter. It also doesn’t integrate some meta specific things out of the box, like their avatars, room model etc, but a standard VR game doesn’t use those anyway, and they only work on meta headsets. [EDIT: room model stuff is available in godot 4.3 now]

As far as objects flickering on the table, this is godot physics and is not XR specific. If you dropped in jolt physics from the assetlib it would go away, as jolt is a lot more stable. One day it will hopefully be the default in the engine.

As for the player being pushed back, this is also a common problem in many commercial VR games like into the radius and ghosts of tabor. You only have three tracking points; the headset and the two controllers. You have no way of knowing if the player is bending over at the hips or if they are only looking down at the neck, so the game assumes their body is straight up and down directly below the headset and prevents them from “walking” in to the table when they are actually just bending over it.

It might sound glib but this is best solved by designing your game around it. Don’t put a lot of wide tables in your environment. Use narrow tables instead or even better, shallow shelves. Give the player remote grab (like XR tools does) so they can pull stuff from a distance. Alternatively remove the collision from the player body and just let them “walk” into stuff. If they put their head in a wall, black out the screen the way half life alyx does.

1 Like

Here’s some extra thoughts by someone with way more gamedev and VR experience than me: Claire Blackshaw: Godot: The Secret XR Tech Move

Thank you a lot: the thing I am more afraid of is lacking the skills to “build my own engine” even using Godot as a seed.
I was thinking more about “using the tools”, rather than building my own set of tools… but those who never try are always sure to fail, so I will try to put together a small tech demo and see if I can manage to turn it into a real game… :smiley:

To be clear from the top of the article this is a series focused on building tools for creativity and productivity space. I was brain dumping of doing Dreams for PlayStation and Modeller for Adobe.

There are a few different things I would say for a gamedev. I personally think Godot is a great choice for a VR game if you are

A) Targeting PCVR (tiny market)
B) Non-Commercial project
C) Already have a game in Godot or are very familiar with Godot
D) An experienced gamedev or have at least one experienced programmer on your team. (Senior and happy to tinker with engine)

Otherwise I would point to Unity or UE5 for a commercial project from a less technical team. I do think Godot would get there but for similar reasons to what is written above the out of the box VR perf might not be what you need atm.

1 Like