VRService.AvatarGestures has numerous problems

Currently, VRService.AvatarGestures has numerous game-breaking problems. In its current state, it can be impossible to use AvatarGestures in your game unless you manually implement some fixes.

Some of these issues have been around since 2024, while some of them are new. To keep things organized, I decided to make a single report for all of them.

All of the following issues only apply in VR, when VRService.AvatarGestures is true on both the server & client. A workaround is provided for each.


Issues

Sorted by severity, in ascending order.

Animations can clip the camera

This isn’t exactly game-breaking, but certain animations can cause your body to clip into the camera while in first-person mode, which can be somewhat annoying and immersion-breaking.

Workaround

What I currently do is procedurally offset the LowerTorso.Root joint every frame, when the Humanoid state changes to Jumping, Freefall, or Swimming, if you’re in first-person mode with VRService.AvatarGestures enabled, to ensure that the character does not move up or forwards during that time. This isn’t a perfect solution, but I’m not sure what else to do without modifying the camera.

Character sometimes slides across the ground

For some reason, disabling VRService.AvatarGestures while in first-person can sometimes cause your character to start slowly sliding across the ground.

When I tried to get footage of this, I was unable to repro, so I don’t know if this is still happening.

Workaround

Briefly switching to third-person will fix this issue. To force third-person in VR, set Camera.CameraType to Scriptable and then immediately back to Custom on VRService.AvatarGestures changed event. See the rbxl file below for example code.

(Note: I had this code disabled in all of the videos shown here.)

Character's head & hands can move after death

When your character dies:

  • You can still animate your head and arms.
  • If Humanoid.BreakJointsOnDeath is true, then the Head, LeftHand, and RightHand will immediately teleport to the world origin. Sometimes your head may begin to fly away from the map on its own.
    • If BreakJointsOnDeath is false but AvatarJointUpgrade is enabled, then the head will still teleport to the world origin, but it will immediately spring back to the torso, due to AvatarJointUpgrade’s ragdoll behavior.
  • This error might be spammed in output: PlayerScripts.PlayerModule.ControlModule:517: attempt to index nil with 'Size'

Workaround

On Humanoid.Died, set VRService.AvatarGestures to false on the client, and re-enable it upon respawning. On the server, set Head.CFrame to HumanoidRootPart.CFrame. See the rbxl file below for example code. (This does not fix the ControlModule error.)

AvatarGestures sometimes doesn't initialize on the client

Sometimes when you join a game, AvatarGestures won’t start on the client, and it acts as if the property is disabled. You will not be able to animate your avatar or see your body in first-person.

When I tried to get footage of this, I was unable to repro, so I don’t know if this is still happening.

Workaround

When your character spawns for the first time, immediately set VRService.AvatarGestures to false and then true again on the client. See the rbxl file below for example code.

Teleporting the character doesn't work

In first-person mode, if you try to teleport your character by setting HumanoidRootPart.CFrame, your camera will not update to the new character position, and the character will automatically slide back to where the camera is.

Workaround

Immediately after teleporting the character, set Camera.CFrame to Head.CFrame. See the rbxl file below for example code.

Humanoid.AutoRotate gets stuck

If you’re in first-person and you push in on the left thumbstick to recenter the camera, you will be completely unable to rotate your avatar in third-person (and in first-person, if AvatarGestures later gets disabled).

This is because, with AvatarGestures enabled, Humanoid.AutoRotate automatically becomes false in first-person, and goes back to true in third-person. However, for whatever reason, recentering the camera in first-person will cause Humanoid.AutoRotate to no longer automatically change, so it will stay false forever.

Humanoid.AutoRotate also does not get re-enabled if you disable AvatarGestures while in first-person, and likewise, it does not get disabled if you enable AvatarGestures while in first-person.

Workaround

Manually toggle Humanoid.AutoRotate on UserGameSettings.RotationType and VRService.AvatarGestures changed event. See the rbxl file below for example code.

If the camera gets too close, character articulation breaks

If the camera gets too close to your character while in third-person mode, your character will immediately begin to run backwards on its own, with outstretched arms and a backwards head, until you switch back to first-person.

This can happen if you run the camera into a wall, or if VRService.AutomaticScaling is enabled and your character is too small. (My character happens to be too small.)

Workaround

Manually toggle VRService.AutomaticScaling on UserGameSettings.RotationType changed event. See the rbxl file below for example code.

This does not fix the problem with running the camera into a wall, which is demonstrated at the end of the following video:

Server Authority breaks character animation

If Workspace.AuthorityMode is set to Server and you are in first-person mode, your character will not animate correctly:

  • On the server, your limbs will constantly jitter and bend incorrectly.
  • On the client, you can try to animate your character, but the limb position will constantly be rolled back.

In third-person mode, this does not happen, and the animation will replicate correctly.

Workaround

Set Workspace.AuthorityMode to Automatic.

PlayerScriptsUseInputActionSystem breaks first-person camera

If Workspace.PlayerScriptsUseInputActionSystem is set to Enabled and you attempt to switch to first-person mode, there is about a 50% chance that the camera will instead fly away from your character at an incredibly fast speed.

Workaround

Set Workspace.PlayerScriptsUseInputActionSystem to Disabled. This option will be removed in the future, so fixing this is important.

AvatarJointUpgrade breaks your arms

If StarterPlayer.AvatarJointUpgrade is enabled:

  • Your arms will not bend correctly, and your character’s hands will be noticeably offset from your VR controllers.
  • If the hierarchy of your character model changes (e.g. you equip a tool), there is a very high chance that your arms will be positioned to [nan, nan, nan], causing them to vanish. This sometimes happens immediately upon spawning.

Workaround

Set StarterPlayer.AvatarJointUpgrade to Disabled. This option will be removed in the future, so fixing this is important.


Files

Here is a place file containing example code to fix most of these issues, using the workarounds described above. The main code is under StarterPlayerScripts and ServerScriptService.

AvatarGestures bug place.rbxl (79.2 KB)

Additionally, Workspace.PlayerScriptsUseInputActionSystem and StarterPlayer.AvatarJointUpgrade were changed to Disabled, and VRService.AvatarGestures was changed to true.

Everything else in the place is used for debugging, such as the GUI used in the demonstration videos above:


System information

  • OS: Windows 10
  • CPU: Intel(R) Core™ i7-6700 CPU @ 3.40GHz
  • Memory: 16 GB
  • GPU: NVIDIA GeForce GTX 1660 Ti
  • VR: Meta Quest 2 w/ Quest Link cable

Expected behavior

It should be possible to use AvatarGestures in your game without having to implement all of these manual fixes.

1 Like