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.

Five-Preset Radial

One Float parameter selects five Animation Clips, each recording a different material in the same renderer slot.

  1. Create and verify the five material Animation Clips.
  2. Connect five FX states with adjacent threshold transitions.
  3. 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.

How the control behaves in VRChat

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.

Keep the slot binding stable

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:

  1. The Expression Parameters asset.
  2. 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:

  1. Add a control.
  2. Name it Jacket Material.
  3. Set its type to Radial Puppet.
  4. Assign Appearance/JacketPreset as the radial parameter.
  5. 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:

  1. Expand Expressions.
  2. Confirm the correct Expressions Menu is assigned.
  3. Confirm the correct Expression Parameters asset is assigned.
  4. Expand Playable Layers.
  5. 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

Related Avatar Guides

Topics: VRChat material radial puppet, Expressions Menu, FX Animator, avatar material presets