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.

PhysBone Toggle Signal

One Bool must connect the Expression Parameters asset, Expressions Menu, FX Animator parameter, and two state transitions.

  1. Choose whether the toggle controls the whole feature or only its VRC Phys Bone component.
  2. Create matching On and Off animation clips in the FX Playable Layer.
  3. Add the TailDynamics menu toggle and test both states after upload.
A runtime toggle does not lower the avatar's performance rank

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.anim
  • TailDynamics_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.

Do not animate PhysBone force properties

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:

  1. Open Expressions.
  2. Confirm Custom Expressions is enabled.
  3. Assign the VRC Expression Parameters asset containing TailDynamics.
  4. Assign the Expressions Menu containing Tail Dynamics.
  5. 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

Related Avatar Guides

Topics: PhysBones, Expressions Menu, FX Animator, avatar dynamics