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.
Keep the grab handle permanently available and animate the prop separately.
- Create a short non-humanoid bone chain with a grabbable PhysBone.
- Set a PhysBone parameter prefix and read its generated
_IsGrabbedBoolean. - On release, use Avatar Parameter Driver to change a separate saved or synchronized prop Boolean.
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:
- Assign
HandleRootas the Root Transform. - Confirm
HandleEndexists or set an Endpoint Position. - Set a non-zero collision Radius.
- Enable Allow Grabbing for the intended user category.
- Disable Allow Posing unless the switch intentionally needs a retained pose.
- Set the Parameter prefix to
Handle. - 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.
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_IsGrabbedis 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
- VRChat PhysBones
- Avatar Parameter Driver
- Animator Parameters
- Expressions Menu and Controls
- Debugging Avatar Components
- Avatar Performance Ranks
Related Guides
- Contacts and PhysBone Grabbing
- Build a Hold-to-Toggle Contact
- Test Avatar Dynamics
- Avatar Creation
- Avatar Optimization Checklist
- VRChat Documentation
Topics: VRChat avatars, Avatar Dynamics, PhysBones, grab toggles, Animator