Toggle PhysBones from the VRChat Expressions Menu
A PhysBone toggle can switch an accessory between dynamic and static behavior, or turn an entire dynamic feature on and off. The menu writes a Bool parameter, the FX Animator selects an On or Off state, and each state holds the required GameObject or component value.
This guide uses TailDynamics as the example parameter. Replace Tail with the feature name while keeping the same spelling and capitalization in every asset.
One Bool must connect the Expression Parameters asset, Expressions Menu, FX Animator parameter, and two state transitions.
- Choose whether the toggle controls the whole feature or only its VRC Phys Bone component.
- Create matching On and Off animation clips in the FX Playable Layer.
- Add the
TailDynamicsmenu toggle and test both states after upload.
VRChat counts GameObjects and components even when they are disabled. A menu toggle changes runtime behavior, but it does not remove PhysBone components, affected transforms, colliders, or collision checks from the uploaded avatar's performance totals.
Video Walkthrough
Use DedZedOffishal's video for the Unity demonstration, then use the current field map and test sequence below.
Creator: DedZedOffishal
Video: Toggling Phys Bones | VRC Avatars for Dummies
Choose the Toggle Target
The target determines what the Off state actually means.
| Target | On state | Off state | Result |
|---|---|---|---|
| Feature GameObject | Active | Inactive | Hides the grouped feature and disables its child components |
| VRC Phys Bone component | Enabled | Disabled | Keeps the accessory visible but stops its PhysBone simulation |
| Interaction child object | Active | Inactive | Keeps the accessory visible while disabling grouped Contacts or optional colliders |
| Static/dynamic pair | Dynamic object active | Static object active | Swaps between two prepared versions |
Do not disable:
- the avatar root
- the GameObject that holds the avatar's main Animator
- the VRC Avatar Descriptor
- an entire shared armature used by the rest of the avatar
- a parent that contains unrelated features
For a self-contained tail feature, a grouped hierarchy makes the animation paths easier to inspect:
Avatar
├── Armature
├── Body
└── Features
└── TailFeature ← optional whole-feature target
├── TailMesh
├── Tail_PhysRoot
│ └── Tail_01
│ └── Tail_02
└── TailDynamics ← VRC Phys Bone component
The Animator remains on the avatar root and can control objects beneath it.
Decide the Default State
Use the same default in all three places:
| Location | Dynamics on by default | Dynamics off by default |
|---|---|---|
| Scene / prefab | Target enabled | Target disabled |
| Expression Parameters | TailDynamics = true |
TailDynamics = false |
| FX layer default state | On | Off |
This alignment prevents the scene, parameter, and controller from disagreeing when the avatar initializes.
Add the Expression Parameter
Open the VRC Expression Parameters asset assigned to the avatar and add:
| Field | Value |
|---|---|
| Name | TailDynamics |
| Type | Bool |
| Default | Match the intended uploaded state |
| Synced | On when other users should receive the state |
A synced Bool uses one bit of the avatar's custom expression-parameter memory. VRChat uses Playable sync for Toggle controls, which is intended for states that turn on and off rather than high-frequency input.
For PC and mobile versions of the same avatar, keep corresponding parameters in the same list position and use the same type. VRChat synchronizes cross-platform parameters by position and type, not by name.
Add the Expressions Menu Control
In the Expressions Menu assigned to the avatar, add a control:
| Menu field | Value |
|---|---|
| Name | Tail Dynamics |
| Type | Toggle |
| Parameter | TailDynamics |
| Value | 1 |
A Toggle sets its parameter while it is on and resets the parameter when turned off. One Expressions Menu can contain up to eight controls; use a Sub-Menu if the current menu is full.
Create the On and Off Clips
Create two Animation Clips for the selected target:
TailDynamics_On.animTailDynamics_Off.anim
Record only the property that distinguishes the two states.
Whole-feature GameObject
| Clip | Recorded property |
|---|---|
| On | TailFeature active |
| Off | TailFeature inactive |
PhysBone component only
| Clip | Recorded property |
|---|---|
| On | VRC Phys Bone component enabled |
| Off | VRC Phys Bone component disabled |
Set Reset When Disabled on the VRC Phys Bone according to the desired return behavior. When enabled, VRChat resets the affected bones to their default positions when the component becomes disabled.
VRChat documents Pull, Spring, Stiffness, and similar PhysBone properties as initialization-time values for avatars. Animating those fields and cycling the component is unsupported. Toggle the component or feature state instead of trying to animate a second physics configuration.
Build the FX Animator Layer
VRChat's FX Playable Layer is the correct place for enabling or disabling GameObjects and components.
Add a Bool parameter named TailDynamics to the FX Animator Controller, then create one Animator layer:
Entry
└── On ───────────────► Off
TailDynamics=false
Off ───────────────► On
TailDynamics=true
Assign the clips:
| Animator state | Motion |
|---|---|
| On | TailDynamics_On.anim |
| Off | TailDynamics_Off.anim |
Set the state matching the uploaded default as the layer's default state.
On → Off
Configure the transition:
Has Exit Time: disabled
Condition: TailDynamics == false
Off → On
Configure the reverse transition:
Has Exit Time: disabled
Condition: TailDynamics == true
Disabling Has Exit Time lets Unity evaluate the Bool condition without waiting for a clip playback point.
Assign the Expression Assets
On the VRC Avatar Descriptor:
- Open Expressions.
- Confirm Custom Expressions is enabled.
- Assign the VRC Expression Parameters asset containing
TailDynamics. - Assign the Expressions Menu containing
Tail Dynamics. - Under Playable Layers, confirm the custom FX Animator Controller is assigned to FX.
Do not assign the same Animator Controller to multiple Playable Layer slots. VRChat combines those layers at runtime and warns that reusing one controller in multiple slots causes problems as the avatar grows.
Whole Feature or Component Only?
Use the behavior you actually want:
| Requirement | Target |
|---|---|
| Hide the tail and stop all of its child systems | Tail feature GameObject |
| Keep the tail visible in its rest pose | VRC Phys Bone component |
| Keep physics but disable a touch interaction | Contact or interaction child object |
| Change to a separately prepared rigid tail | Static/dynamic object pair |
If the renderer, PhysBone, Contacts, and colliders live on different branches, a mesh-only animation will not disable the other branches. Group the related objects or record each required enable state in both clips.
Test the Toggle
Use VRChat's in-editor Play mode and a private upload:
| Test | Expected result |
|---|---|
| Avatar initializes | Scene state, parameter default, and FX default state agree |
| Toggle turns off | Selected GameObject or PhysBone component disables immediately |
| Toggle turns on | Selected target enables and the chain resumes |
| Repeat five times | Every transition remains reversible |
| Walk and stop after enabling | PhysBone motion returns normally |
| Grab or pose before disabling | Disabled feature no longer behaves as active |
| Disable, change avatar, return | Uploaded default or configured persistence behavior is predictable |
| Remote user watches | Synced visibility or dynamics state is represented as intended |
| Avatar Overlay enabled | PhysBone visualization matches the active component state |
| SDK performance panel | Counts remain unchanged when the runtime toggle is off |
The Action Menu's Avatar Overlay can display PhysBones and Contacts in the running client. In Unity Play mode, the SDK can also simulate PhysBones and expose their current component parameters.
Mobile and Performance Behavior
A toggle is not a substitute for a mobile avatar variant:
- disabled GameObjects and components still count toward Avatar Performance Rank
- mobile PhysBone hard limits apply to the uploaded avatar's component totals
- turning a feature off at runtime does not recover a component removed by the mobile limits
- a real lower-cost mobile version must contain fewer components, affected transforms, colliders, or collision checks
Use per-platform avatar overrides or a separately prepared mobile version when the avatar needs a different component budget.
Troubleshooting
Help! The menu toggle changes but the feature does not.
Compare TailDynamics in the Expression Parameters asset, menu control, FX Animator parameter, and transition conditions. The name and Bool type must agree in every location.
Help! The feature starts in the wrong state.
Align the scene object's enabled state, the Expression Parameter default, and the FX layer's default Animator state. All three should describe the same uploaded default.
Help! The tail disappears when I only wanted static mode.
Your clips are probably controlling the whole feature GameObject or renderer. Record the VRC Phys Bone component's enabled state instead so the mesh remains visible.
Help! The tail hides but Contacts still activate.
The Contacts are likely outside the disabled feature hierarchy. Move them under the intended feature group or record their enabled state in both animation clips.
Help! The PhysBone returns in a stretched or rotated pose.
Enable Reset When Disabled on the VRC Phys Bone if the chain should return to its default transform pose before simulation resumes.
Help! The transition waits before changing state.
Disable Has Exit Time on both transitions and confirm each transition has the appropriate true or false Bool condition.
Help! Other users see the wrong state.
Confirm TailDynamics is synchronized in the VRC Expression Parameters asset. For PC and mobile versions, keep its list position and type consistent across both avatars.
Help! Turning the feature off does not improve the performance rank.
This is expected. VRChat counts disabled GameObjects and components. Reduce or remove PhysBone components, affected transforms, colliders, and collision checks in the uploaded avatar to change those statistics.
Official References
- VRChat PhysBones
- Expressions Menu and Controls
- Animator Parameters
- Playable Layers
- Avatar Performance Ranks
- Debugging Avatar Components
- Unity Animation window
- Unity Animator transitions
Related Avatar Guides
- Set Up PhysBones for Avatar Secondary Motion
- PhysBones
- Saving Toggles
- Toggle an Avatar Object
- Use PhysBone Grabbing, Posing, and Parameters
- Avatar Optimization Checklist
Topics: PhysBones, Expressions Menu, FX Animator, avatar dynamics