Create a VRChat Avatar Object Toggle

An object toggle lets the wearer show or hide an avatar prop, accessory, clothing part, or visual feature from the VRChat Expressions Menu.

The complete setup uses five connected pieces: two Animation Clips, a Bool in the FX Animator, the same Bool in the VRC Expression Parameters asset, a Toggle control in the Expressions Menu, and the correct assets on the VRC Avatar Descriptor.

Object Toggle Signal

Use one Bool name from the Action Menu through to the FX Animator state that controls the object.

  1. Record one clip with the object active and one with it inactive.
  2. Connect both states with true and false conditions on the same Bool.
  3. Add the Bool to the expression assets and verify the Descriptor assignments.
Hidden objects still count toward Avatar Performance Rank

VRChat counts GameObjects and components even when they are disabled. An object toggle changes runtime visibility; it does not remove meshes, materials, PhysBones, Contacts, or other components from the uploaded avatar's performance totals.

Video Walkthrough

Use DedZedOffishal's video for the Unity demonstration and the field-by-field guide below while building the toggle.

Creator: DedZedOffishal
Video: Toggle Object | VRC Avatars for Dummies

The Five-Asset Signal Path

Expressions Menu
  Toggle: Glasses
        │
        ▼
VRC Expression Parameters
  Bool: Props/Glasses
        │
        ▼
FX Animator Controller
  Bool: Props/Glasses
        │
        ├── false ─► Glasses Off clip
        └── true  ─► Glasses On clip

The VRC Avatar Descriptor assigns the Expressions Menu, Expression Parameters asset, and FX Animator Controller to the uploaded avatar.

Piece Required value
Object Child GameObject to show or hide
Animation Clips One active clip and one inactive clip
FX parameter Bool named Props/Glasses
Expression Parameter Bool named Props/Glasses
Menu control Toggle targeting Props/Glasses

Names and parameter types must match. Props/Glasses, Props/glasses, and Glasses are three different names.

Choose a Safe Target

The target should be a self-contained child of the avatar:

Avatar
├── Armature
├── Body
└── Props
    └── Glasses       ← toggle this GameObject

Suitable targets include:

  • glasses or head accessories
  • handheld or attached props
  • optional clothing meshes
  • decorative effect groups
  • a parent containing every part of one feature

Do not disable:

  • the avatar root
  • the GameObject with the VRC Avatar Descriptor
  • the avatar's main Animator
  • the complete armature
  • a parent shared by unrelated clothing or features

When a feature contains a renderer, particle system, Contact, PhysBone, or other child components, decide whether the entire group should disable together. Toggling only the visible mesh can leave the other components active elsewhere in the hierarchy.

Decide the Uploaded Default

This example uses glasses off by default.

Keep all three defaults aligned:

Location Glasses off by default
Scene or prefab Glasses GameObject inactive
Expression Parameter Default false
FX Animator default state Glasses Off

For glasses on by default, set the GameObject active, parameter Default true, and Glasses On as the Animator layer default.

Saved parameter data may override the Default when the avatar loads. Use Save VRChat Avatar Toggle States when the wearer should retain their last choice.

Record the Animation Clips

Create two clips:

  • Glasses_On.anim
  • Glasses_Off.anim

Select the avatar root before opening Unity's Animation window so the recorded property path is relative to the same Animator that will play the clip.

Record the Glasses GameObject's active state:

Clip GameObject state
Glasses_On.anim Active
Glasses_Off.anim Inactive

Inspect each clip after recording. It should contain the intended GameObject active property and should not contain accidental Transform, blend shape, material, or unrelated component keys.

Hierarchy paths are part of the clip

The Animation Clip targets the object's path below the avatar Animator. Renaming or re-parenting the object after recording can break that binding. Reopen both clips and verify the target path after a hierarchy change.

Add the Bool to the FX Animator

Open the FX Animator Controller and add:

Animator parameter field Value
Name Props/Glasses
Type Bool
Default Match the uploaded default

Create a dedicated Animator layer with two states:

Entry
  └── Glasses Off ─────────────► Glasses On
       Props/Glasses == true

      Glasses On ──────────────► Glasses Off
       Props/Glasses == false

Assign the clips:

State Motion
Glasses Off Glasses_Off.anim
Glasses On Glasses_On.anim

Set the state that matches the uploaded default as the layer's default state.

Configure Both Transitions

Glasses Off → Glasses On

Has Exit Time: disabled
Transition Duration: 0
Condition: Props/Glasses == true

Glasses On → Glasses Off

Has Exit Time: disabled
Transition Duration: 0
Condition: Props/Glasses == false

An active-state property is discrete, so it does not need an animation blend. Disabling Has Exit Time lets the Bool condition take effect without waiting for a playback point.

Both transitions are required. VRChat advises that custom parameters can change at any time; an Animator branch without a return transition can become stuck.

Add the Expression Parameter

In the VRC Expression Parameters asset assigned to the avatar, add:

Field Value
Name Props/Glasses
Type Bool
Default Match the scene and Animator default
Saved On only if the wearer's choice should persist
Synced On when remote players should receive the value

A synced Bool uses one bit of the 256-bit synchronized custom-parameter budget.

For PC and mobile versions of the same avatar, use the same Expression Parameters asset. VRChat matches cross-platform parameters by list position and type, not by name.

Add the Expressions Menu Toggle

In the Expressions Menu assigned to the avatar, add:

Menu field Value
Name Glasses
Type Toggle
Parameter Props/Glasses

Current VRChat SDK versions hide the Value field for a Toggle that targets a Bool. Activating the control sets the Bool true and deactivating it sets the Bool false.

One menu contains up to eight controls. Put additional controls in a Sub-Menu when the current menu is full.

Assign the Assets on the Avatar Descriptor

Select the avatar root and open the VRC Avatar Descriptor:

  1. Under Expressions, enable Custom Expressions.
  2. Assign the Expressions Menu containing Glasses.
  3. Assign the VRC Expression Parameters asset containing Props/Glasses.
  4. Under Playable Layers, confirm the custom FX Animator Controller is assigned to FX.

VRChat supports Animation Controllers in Playable Layer slots. Do not place the same controller in several Playable Layers.

Check the Complete Mapping

Before uploading, compare every field:

Location Name / state
Glasses GameObject Inactive for an off-by-default setup
On clip Glasses active
Off clip Glasses inactive
FX Animator Bool Props/Glasses
Off → On condition Props/Glasses == true
On → Off condition Props/Glasses == false
Expression Parameter Props/Glasses, Bool
Menu Toggle Targets Props/Glasses
Avatar Descriptor Menu Correct Expressions Menu asset
Avatar Descriptor Parameters Correct Expression Parameters asset
Avatar Descriptor FX Correct FX Animator Controller

Test the Toggle

Run the full sequence on a private upload:

Test Expected result
Avatar loads Object matches the uploaded default
Turn Toggle on Object appears immediately
Turn Toggle off Object disappears immediately
Repeat five times Both transitions remain reversible
Open a mirror Local and mirror appearance agree
Ask another user to observe Remote state agrees when Synced is enabled
Switch avatar and return Saved or Default behavior matches the parameter settings
Reset the avatar Parameter and object return to Default
Test PC and mobile versions Parameter position and type remain aligned
Review Avatar Stats Disabled object still contributes to uploaded performance totals

Troubleshooting

Help! The menu Toggle appears but the object does not change.

Compare the full Bool name in the menu, Expression Parameters asset, FX Animator parameter, and transition conditions. Then confirm the Descriptor uses the assets you edited.

Help! The wrong object is toggling.

Inspect the binding in both Animation Clips. Remove the unintended property and record the active state of the correct child GameObject from the avatar root.

Help! The clip says its target is missing.

The object was probably renamed or re-parented after recording. Restore the original hierarchy path or record the active-state property again at the new path.

Help! The object starts in the wrong state.

Align the scene active state, Expression Parameter Default, FX Bool default, and FX layer default state. If Saved is enabled, reset the avatar before evaluating a changed Default.

Help! The Toggle only works in one direction.

Add the missing reverse transition. Off must transition to On when the Bool is true, and On must transition to Off when it is false.

Help! The Toggle waits before changing the object.

Disable Has Exit Time and set Transition Duration to zero on both transitions so the discrete active-state change follows the Bool immediately.

Help! Other players do not see the object state.

Enable Synced on the Bool in the VRC Expression Parameters asset. Confirm the remote-visible object and animation clip also exist on the platform version the observer receives.

Help! Hiding the object did not improve the performance rank.

This is expected. VRChat counts disabled GameObjects and components. Remove or reduce the uploaded meshes, materials, and components to change those statistics.

Official References

Continue with Avatar Toggles

Topics: object toggles, Expressions Menu, FX Animator, avatar customization