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.
Use one Bool name from the Action Menu through to the FX Animator state that controls the object.
- Record one clip with the object active and one with it inactive.
- Connect both states with true and false conditions on the same Bool.
- Add the Bool to the expression assets and verify the Descriptor assignments.
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.animGlasses_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.
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:
- Under Expressions, enable Custom Expressions.
- Assign the Expressions Menu containing
Glasses. - Assign the VRC Expression Parameters asset containing
Props/Glasses. - 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
- Expressions Menu and Controls
- Animator Parameters
- Playable Layers
- Avatar Performance Ranks
- SDK 3.10.2 expression editor changes
- Unity Animation window
- Unity Animator transitions
Continue with Avatar Toggles
- Save VRChat Avatar Toggle States
- Toggle PhysBones from the Expressions Menu
- Create Exclusive Avatar Tags
- Swap Avatar Materials
- Create an RGB Radial Slider
- Avatar Creation Guides
Topics: object toggles, Expressions Menu, FX Animator, avatar customization