Toggle Avatar Props with a PhysBone Grab Handle

Use a small PhysBone handle as a physical switch for an avatar prop. VRChat exposes an IsGrabbed Animator parameter for each named PhysBone. Animator logic can use that temporary signal to show an effect while held or commit a persistent prop toggle when the user releases the handle.

Recommended design

Keep the grab handle permanently available and animate the prop separately.

  1. Create a short non-humanoid bone chain with a grabbable PhysBone.
  2. Set a PhysBone parameter prefix and read its generated _IsGrabbed Boolean.
  3. On release, use Avatar Parameter Driver to change a separate saved or synchronized prop Boolean.
Do not hide the switch with the prop

If the prop's off animation disables the GameObject containing the PhysBone, the handle cannot be grabbed to turn it back on. Keep the handle chain outside the animated prop hierarchy.

Video Companion

Creator: akalink
Video: Avatar Dynamics Grab Prop Toggles

Choose the Interaction

Behavior Animator input Output
Prop visible only while the handle is held Handle_IsGrabbed Direct temporary animation
Prop toggles when a grab begins Rising edge of Handle_IsGrabbed Latched Boolean
Prop toggles when the handle is released Grabbed state followed by Handle_IsGrabbed = false Latched Boolean
Prop reacts to grab angle or stretch Handle_Angle or Handle_Stretch Blend Tree or threshold

Release-to-toggle provides a deliberate grab cycle and naturally waits for the hand to let go before the next activation. The detailed setup below uses that behavior.

Scene Hierarchy

Keep the input handle and output prop separate:

Avatar
├── Armature
│   └── Chest
│       └── GrabToggleAnchor
│           ├── HandleRoot
│           │   └── HandleEnd
│           └── HandleVisual
└── PropOutput
    ├── PropMesh
    ├── Effects
    └── Audio

Add VRC Phys Bone to HandleRoot or a dedicated component object that references it. Do not use humanoid bones as the PhysBone root.

The handle needs a bone chain or an Endpoint Position. A single root with no child or endpoint does not provide a usable PhysBone chain.

Parameter Plan

Parameter Type Defined in Purpose
Handle_IsGrabbed Bool FX Animator only Generated by the PhysBone while grabbed
PropEnabled Bool FX Animator and Expression Parameters Stores the final prop state

Set the PhysBone's Parameter field to Handle. VRChat then supplies:

  • Handle_IsGrabbed;
  • Handle_IsPosed;
  • Handle_Angle;
  • Handle_Stretch;
  • Handle_Squish.

PhysBone-generated parameters do not need to be added to the Expression Parameters asset. VRChat evaluates them on local and remote avatar copies.

Configure PropEnabled:

  • Synced: enable when other players should see the result;
  • Saved: enable when the choice should survive avatar or world changes;
  • Default: set the intended state when Saved is disabled or no saved value exists.

Configure the Grab Handle PhysBone

Minimum handle setup:

  1. Assign HandleRoot as the Root Transform.
  2. Confirm HandleEnd exists or set an Endpoint Position.
  3. Set a non-zero collision Radius.
  4. Enable Allow Grabbing for the intended user category.
  5. Disable Allow Posing unless the switch intentionally needs a retained pose.
  6. Set the Parameter prefix to Handle.
  7. Inspect the PhysBone gizmo in the Scene view.
Setting Suggested intent
Pull Return the handle to its rest position after release
Spring or Momentum Add only as much overshoot as the handle design needs
Limit Type Constrain the handle to a believable switch direction
Grab Movement Increase for a handle that should follow the hand closely
Snap To Hand Enable only when the handle should jump to the grabbing point
Reset When Disabled Restore the rest position if the component is disabled

The collision Radius is used for grabbing as well as collision. Fit it around the visible handle without covering unrelated avatar parts.

Configure Who Can Grab It

PhysBone avatar settings can filter grabbing and posing between the wearer and other users.

Feature intent Allow Grabbing
Personal prop switch Self enabled, Others disabled
Interactive prop for friends or visitors Self and Others enabled
Display-only moving part Grabbing disabled

VRChat's user Permissions and Settings also govern Avatar Dynamics interaction. A correctly configured other-player grab may still be blocked by a user's current permissions.

Do not use an other-player grab as the only way to restore essential avatar visibility or controls. Keep an Expressions Menu fallback.

Direct While-Grabbed Variant

For an effect that should exist only while held, use a two-state FX layer:

Released
└── Handle_IsGrabbed = true → Grabbed

Grabbed
└── Handle_IsGrabbed = false → Released

Animate the prop response directly in these states. Do not add Handle_IsGrabbed to Expression Parameters.

This variant is suitable for:

  • highlighting a handle;
  • changing a facial reaction while grabbed;
  • playing a held pose or temporary effect;
  • showing grab feedback.

It is not a persistent toggle because the output returns when the grab ends.

Build a Release-to-Toggle State Machine

Use the generated grab signal to identify a complete grab and release:

Entry
├── PropEnabled = false → Off Ready
└── PropEnabled = true  → On Ready

Off Ready
└── Handle_IsGrabbed = true → Grabbed from Off
    └── Handle_IsGrabbed = false → Set On
        └── On Ready

On Ready
└── Handle_IsGrabbed = true → Grabbed from On
    └── Handle_IsGrabbed = false → Set Off
        └── Off Ready

The two Grabbed states remember which state existed before the grab. Releasing from Off commits On; releasing from On commits Off.

Entry branches must inspect PropEnabled. A saved value, menu control, or remote update may already have changed the parameter before this logic layer begins.

Configure the Parameter Driver States

Add Avatar Parameter Driver:

State Operation
Set On Set PropEnabled to true
Set Off Set PropEnabled to false

Enable Local Only on these drivers. The avatar wearer's local copy should commit the synchronized prop state; remote avatar copies display the result.

VRChat executes Parameter Driver operations when the Animator enters their state. Keep each driver state and its transitions alive for at least 0.02 seconds when using very short states, then continue to the matching ready state.

Do not use Add or Random to invert the Boolean. Explicit Set On and Set Off states are easier to synchronize and debug.

Handle external changes

Add reconciliation transitions between Off Ready and On Ready when PropEnabled changes through the Expressions Menu. Decide whether menu changes should apply immediately during an active grab or after release, then test that choice.

Animate the Prop on a Separate Layer

Use a second FX layer for the actual prop:

Prop Off
└── PropEnabled = true → Prop On

Prop On
└── PropEnabled = false → Prop Off

The output layer can animate:

  • prop GameObject active state;
  • materials or blendshapes;
  • particles;
  • an Animator on the prop;
  • completion feedback.

Do not animate the always-available handle hierarchy off. If the handle should become visually subtle, hide only its renderer while preserving the PhysBone chain and an understandable interaction target.

Every property animated in Prop On should have a defined value in Prop Off. This prevents the prop from remaining partly enabled after another FX layer or avatar state changes.

Add an Expressions Menu Fallback

Create a Toggle control that writes PropEnabled.

The fallback:

  • supports Desktop and mobile users;
  • restores control when Avatar Dynamics permissions block grabbing;
  • provides a known state during debugging;
  • lets the wearer operate a self-only prop without reaching the handle.

Use the same Boolean for the menu and output layer. Do not create a separate menu Boolean unless there is explicit logic to keep both values aligned.

Add Grab Feedback

Make the handle's state readable:

  • change emission while Handle_IsGrabbed is true;
  • animate a short click when Set On or Set Off runs;
  • show separate on and off indicators;
  • use a constrained hinge or angle so the handle movement resembles a switch.

Avoid feedback that hides the handle before release. The user needs to complete the grab cycle cleanly.

If using audio, remember that remote playback based on Animator state depends on the parameters and state path being consistent across clients.

Test the Complete Grab Cycle

Test in Unity Play mode, then use Build & Test and an uploaded private avatar for remote behavior.

Test Expected result
Handle is grabbed from Off Handle_IsGrabbed becomes true; output remains Off until release
Handle is released from Off Set On runs once and prop becomes enabled
Handle is grabbed from On Grabbed from On becomes active
Handle is released from On Set Off runs once and prop becomes disabled
Handle remains held State does not repeatedly toggle
Menu changes PropEnabled Logic returns to the matching ready state
Avatar reloads with Saved enabled Previous prop state returns
Remote player observes Synced output Prop state matches the wearer
Other-player grab is disabled Observer cannot operate the handle
Avatar Dynamics permissions change Menu fallback remains usable
Mobile variant loads Prop and fallback meet the intended platform behavior

Use Avatar Overlay in VRChat to inspect the PhysBone radius when the handle looks reachable but cannot be grabbed.

Help! The handle moves but cannot be grabbed.

Confirm Allow Grabbing is enabled for the intended user, the chain has a usable non-zero Radius, and Avatar Dynamics permissions permit the interaction. Inspect the radius with Avatar Overlay.

Help! The generated IsGrabbed parameter never changes.

Set a Parameter prefix on the PhysBone and create the exact generated Boolean name in the FX Animator, such as Handle_IsGrabbed. Do not add it to Expression Parameters.

Help! The prop toggles repeatedly while I hold the handle.

Use separate Grabbed from Off and Grabbed from On states, and commit the new value only when Handle_IsGrabbed returns to false.

Help! I cannot turn the prop back on.

The off animation may be disabling the PhysBone or its hierarchy. Move the handle outside the prop output hierarchy and animate only the prop's visual and effect objects.

Help! Other players see a different prop state.

Add PropEnabled to Expression Parameters and enable Synced. Keep the Parameter Driver local-only so the wearer commits the result, while remote copies use the synchronized output.

Help! The menu and grab toggle fight each other.

Use one shared PropEnabled Boolean and add ready-state transitions that reconcile external changes. Avoid separate output parameters for the menu and grab interaction.

Help! The prop stays in the wrong state after changing avatars.

Review the Saved and Default settings for PropEnabled, then confirm Entry branches to the ready state matching the current value.

Official References

Related Guides

Topics: VRChat avatars, Avatar Dynamics, PhysBones, grab toggles, Animator