Select Avatar Materials with a VRChat Radial Puppet
A Radial Puppet can control several material presets through one Float parameter. Moving the radial control changes that value from 0.0 to 1.0; the avatar's FX Animator then selects the material assigned to that part of the range.
This guide uses five fixed material presets. If you only need two appearances, build a normal material toggle. If you want a continuously changing shader property instead of fixed materials, use the RGB radial slider guide.
One Float parameter selects five Animation Clips, each recording a different material in the same renderer slot.
- Create and verify the five material Animation Clips.
- Connect five FX states with adjacent threshold transitions.
- Add one Radial Puppet that controls the matching Float parameter.
Video Walkthrough
Video creator: DedZedOffishal
Use the walkthrough for the Unity interaction, then use the tables below for parameter names, transition thresholds, and test cases.
VRChat documents the Radial Puppet as a single Float control with an output from 0.0 to 1.0. Its value remains where the wearer leaves it after closing the puppet, until another control or animation changes that parameter.
Decide Whether Fixed Presets Belong on a Radial
| Appearance control | Recommended menu control | Reason |
|---|---|---|
| Two materials | Toggle | Both states are easy to understand |
| Several named outfits | Sub-Menu with labeled controls | Every choice remains visible by name |
| Four or five visual presets | Radial Puppet | One menu slot can select the full set |
| Smooth hue, emission, or dissolve | Radial Puppet with an animatable shader property | The visual result follows the continuous value |
A fixed-preset radial is compact, but VRChat does not display a separate label for each point around the control. Give each material an obvious visual difference and use an icon that communicates what the radial changes.
What You Need
- One avatar with a configured VRC Avatar Descriptor.
- One Expressions Menu asset assigned to the descriptor.
- One Expression Parameters asset assigned to the descriptor.
- One custom FX Animator Controller assigned in the descriptor's Playable Layers.
- Five compatible materials for the same renderer slot.
- Five Animation Clips, each recording one of those materials.
- A backup or version-control checkpoint before editing the FX controller.
Complete Swap Avatar Materials from the VRChat Expressions Menu first if you have not yet recorded and tested a two-material swap.
1. Prepare the Material Clips
Select the renderer and confirm which element in its Materials list you intend to control. Every clip in this radial must target that same renderer path and the same element index.
Create one clip for each appearance:
Jacket_00_Default.anim
Jacket_01_Blue.anim
Jacket_02_Red.anim
Jacket_03_Gold.anim
Jacket_04_Glow.anim
Record the chosen material into each clip, then preview the clips one at a time. Confirm that only the intended part changes.
| Clip | Recorded material | Radial region |
|---|---|---|
Jacket_00_Default |
Default jacket | Below 0.125 |
Jacket_01_Blue |
Blue jacket | Between 0.125 and 0.375 |
Jacket_02_Red |
Red jacket | Between 0.375 and 0.625 |
Jacket_03_Gold |
Gold jacket | Between 0.625 and 0.875 |
Jacket_04_Glow |
Glow jacket | Above 0.875 |
These ranges are an example. What matters is that your Animator thresholds and your written map agree.
An Animation Clip records the renderer path and material element it controls. Renaming, re-parenting, or changing the renderer's Materials list after recording can leave a clip targeting the wrong object or element.
2. Add the Float Parameter
Use the same name and type in both places:
Parameter: Appearance/JacketPreset
Type: Float
Default: 0
Add it to:
- The Expression Parameters asset.
- The FX Animator Controller's Parameters tab.
Parameter names are case-sensitive. VRChat recommends matching the custom parameter type to the Animator parameter type.
Saved and Synced
| Option | Enable it when | Result |
|---|---|---|
| Saved | The wearer expects the chosen material to remain after changing worlds or avatars | VRChat retains the user's selection |
| Synced | Other players need to see the selected material | VRChat sends the custom parameter to remote players |
| Neither | The radial is only a local or temporary effect | The value returns to its configured default when reset |
A synced Float uses 8 bits of custom parameter memory. Check the Expression Parameters asset's memory total instead of duplicating the radial with extra parameters.
3. Build the FX Layer
Create a dedicated FX layer named Material - Jacket Preset. Set the layer weight to 1.
Add five states and assign one material clip to each:
Jacket 00 Default
Jacket 01 Blue
Jacket 02 Red
Jacket 03 Gold
Jacket 04 Glow
Make Jacket 00 Default the orange default state so the Animator matches the parameter default of 0.
Connect Adjacent States
Connect each state to the state directly above and below it. This creates a reversible chain:
Default ⇄ Blue ⇄ Red ⇄ Gold ⇄ Glow
Configure the transitions as follows:
| Transition | Condition |
|---|---|
| Default → Blue | Appearance/JacketPreset Greater 0.125 |
| Blue → Default | Appearance/JacketPreset Less 0.125 |
| Blue → Red | Appearance/JacketPreset Greater 0.375 |
| Red → Blue | Appearance/JacketPreset Less 0.375 |
| Red → Gold | Appearance/JacketPreset Greater 0.625 |
| Gold → Red | Appearance/JacketPreset Less 0.625 |
| Gold → Glow | Appearance/JacketPreset Greater 0.875 |
| Glow → Gold | Appearance/JacketPreset Less 0.875 |
For every transition:
- Disable Has Exit Time.
- Use a transition duration of
0. - Do not add an exit state that can trap the layer.
The adjacent chain may pass through intermediate states for a frame when the parameter moves across several ranges. Because every state has a path in both directions, it still reaches the requested preset without a dead end.
At an exact boundary, neither the Greater nor Less condition is true, so the current state remains active until the value moves past that boundary.
4. Add the Radial Puppet
Open the Expressions Menu asset that should contain the material selector:
- Add a control.
- Name it
Jacket Material. - Set its type to Radial Puppet.
- Assign
Appearance/JacketPresetas the radial parameter. - Add an icon if you have one that clearly represents the jacket appearance.
VRChat allows up to eight controls in one Expressions Menu asset. If the current menu is full, create a Sub-Menu asset and link it from the parent menu.
5. Assign the Assets to the Avatar
On the VRC Avatar Descriptor:
- Expand Expressions.
- Confirm the correct Expressions Menu is assigned.
- Confirm the correct Expression Parameters asset is assigned.
- Expand Playable Layers.
- Confirm the FX layer uses the controller you edited.
A correctly configured menu cannot animate the material if the avatar uploads with a different Parameters asset or FX controller.
6. Keep PC and Mobile Versions Aligned
VRChat supports separate platform versions under the same avatar ID. The mobile version may need different materials or shaders, but the control should keep the same meaning.
| Item | PC version | Mobile version |
|---|---|---|
| Parameter position | Same list position | Same list position |
| Parameter type | Float |
Float |
| Default | 0 |
0 |
| Radial meaning | Default → Blue → Red → Gold → Glow | Default → Blue → Red → Gold → Glow |
| Materials | PC-compatible set | Mobile-compatible set |
VRChat synchronizes custom parameters between PC and mobile avatar versions by list position and type rather than parameter name. Using the same Expression Parameters asset for both versions is the safest way to preserve that ordering.
Test Matrix
Test a private upload before publishing the avatar.
| Test | Expected result |
|---|---|
| Avatar loads for the first time | Default material is active |
Radial moves just above 0.125 |
Blue material becomes active |
Radial moves just above 0.375 |
Red material becomes active |
Radial moves just above 0.625 |
Gold material becomes active |
Radial moves just above 0.875 |
Glow material becomes active |
Radial moves from 1.0 back to 0.0 |
Every reverse transition remains available |
| Puppet closes | Selected value remains active |
| Avatar resets with Saved disabled | Parameter returns to its default |
| World or avatar changes with Saved enabled | Chosen preset is retained |
| Another player observes a Synced parameter | Remote avatar reaches the same preset |
| PC and mobile versions are viewed | Both versions use the same preset meaning |
Troubleshooting
Help! The radial moves but the material never changes.
Confirm that Appearance/JacketPreset is a Float in both the Expression Parameters asset and the FX controller. Then confirm the descriptor uses the menu, Parameters asset, and FX controller you edited.
Help! The radial stops on the wrong preset.
Compare every Greater and Less condition with the threshold table. A copied transition with the wrong threshold can make one state occupy too much of the radial range.
Help! I can move upward through presets but not back down.
Add the missing reverse transitions. Every adjacent pair needs both directions, and the reverse transition needs a Less condition at the same boundary.
Help! The avatar starts with the wrong material.
Align the Expression Parameters default, the FX layer's orange default state, and the material already assigned to the renderer. Temporarily disable Saved while testing a changed default.
Help! The material flickers near a boundary.
Inspect the live Float value and transition conditions in the Animator. Remove overlapping conditions, make sure no second layer controls the same material slot, and test values on both sides of the boundary.
Help! Other players see a different preset.
Enable Synced for the custom Float, then verify that remote testing uses the uploaded avatar version. Also confirm that PC and mobile versions place the parameter at the same list position with the same type.
Help! One platform shows a pink material.
Replace that platform's affected material with one that uses a supported shader, then record the replacement material in the corresponding platform Animation Clip. Keep the same preset order.
Help! The wrong mesh section changes.
Open each Animation Clip and check its recorded renderer path and material element. All five clips must target the same intended element in the renderer's Materials list.
Official References
- VRChat Expressions Menu and Controls
- VRChat Animator Parameters
- VRChat Playable Layers
- VRChat Per-Platform Avatar Overrides
Related Avatar Guides
- Swap Avatar Materials from the Expressions Menu
- Create an RGB Radial Slider
- Save Avatar Toggle States
- Create an Object Toggle
- VRChat Avatar Optimization Checklist
Topics: VRChat material radial puppet, Expressions Menu, FX Animator, avatar material presets