Animations
Animations on VRChat avatars are built with Unity animation clips, Animator Controllers, and avatar parameters.
Avatar animation setups commonly combine:
- Animator Controllers to choose states and transitions.
- Animation clips to keyframe property changes over time.
- Built-in and custom parameters from Expressions to drive states, blend trees, and continuous controls.
In Avatar 3.0 workflows, the controllers used for avatar behavior are assigned through the Avatar Descriptor playable-layer slots.
Animation clips
An Animation Clip is a .anim asset containing keyframed values over time.
Avatar clips animate:
- Transform position, rotation, and scale.
- GameObject active states and component enabled flags.
- Component values (for example blendshape weights, constraints, particle settings).
- Material and shader properties.
- Material swaps.
Material swaps are object-reference curves, so they behave as step changes rather than smooth blends.
In Unity's Animation window:
- Record mode automatically writes keys when an animatable value changes.
- Preview mode previews changes without automatically creating keys.
Animated object paths are relative to the Animator root. If a path no longer resolves, the curve remains in the clip but will not affect anything at runtime.
Creators often separate clips into:
- Static clips: hold constant values (for example, on/off states).
- Dynamic clips: change values over time (for example, dissolves or hue shifts).
Give even static clips a small duration (for example, two identical keyframes) so state timing is explicit.
Clip settings
| Setting | Effect | Typical use |
|---|---|---|
| Loop Time | Repeats the clip when it reaches the end. | Idle loops, repeating effects, and cyclical motions. |
| Loop Pose | Adds seam correction for loop continuity. | Smoother start/end blending on looping motion. |
| Cycle Offset | Starts playback at a normalized offset in the clip. | Desynchronizing repeated effects or phase-shifted motion. |
Blend Trees
Blend Trees combine multiple motions using Animator parameters. Direct blend trees can play multiple motions at once.
Forms include:
- 1D blend trees for scalar controls.
- 2D blend trees for two-axis controls.
- Direct (DBT) blend trees for per-motion weight control.
Blend-tree inputs are Float parameters in Unity's Animator. In VRChat, Bool and Int expression values can still drive these workflows through parameter conversion.
Motion time
States can enable Motion Time, using a parameter to scrub through a clip's normalized timeline.
On avatars, this is often paired with radial or axis puppet inputs for continuous controls. Limiting input ranges and transition paths helps avoid snapping or unreachable states.
Where avatar animations should run
Playable layers are evaluated in order (Base, Additive, Gesture, Action, then FX), so higher layers can override lower layers when both animate the same property.
| Playable-layer scope | Typical animation content |
|---|---|
| Base / Additive / Gesture / Action | Transform animation (position, rotation, scale), usually for locomotion, gestures, and full-body actions. |
| FX | Non-transform avatar features such as GameObject toggles, blendshapes, material and shader values, particle settings, and other component properties. |
Non-transform animation should be kept in FX for expected mirror and remote behavior. Playable-layer slots should use Animation Controllers, and reusing the same controller in multiple playable layers is discouraged.
Advanced techniques
Some avatar animation patterns use advanced Unity setups, such as:
- Direct blend tree combinations for compact logic. Animator Optimizer are using this to reduce CPU usage.
- Animated Animator Parameters (AAPs).
- Scale-reactive systems driven by avatar scaling parameters.
Animated Animator Parameters (AAPs)
Float Animator parameters can be animated directly by an animation clip. When a clip keyframes an Animator parameter, the value is applied each frame the state is active. Parameters animated this way have the following behaviors:
- The animated value is forced even when the animator is not actively in a state that explicitly sets it.
- The value is only applied within the same Animator Controller. For example, an AAP set in the FX layer does not propagate to the Gesture layer.
- Avatar Parameter Drivers cannot override an AAP value on the same controller while the animating state is active.
Common AAP techniques include:
Remembering a value
A state with Motion Time (formerly Normalized Time) set to the same parameter being animated creates a feedback loop. A linear animation clip that animates the parameter from 0 to 1 allows the state to hold the last-known value of the parameter.
Copying a VRChat parameter
Setting the Motion Time input to a VRChat built-in parameter (such as GestureLeftWeight) and animating a different parameter from 0 to 1 copies the input value into the target parameter each frame. Combined with the remembering technique, this can store the last-known value after the original input changes.
Remapping a value
A linear animation clip that animates a parameter from X to Y, driven by Motion Time, remaps the input range [0, 1] to the output range [X, Y]. For example, an animation from -1 to 1 remaps the [0, 1] input to a [-1, 1] output.
Smoothing a value
Smoothing uses three nested blend trees to implement a weighted average:
CurrentValue = CurrentValue × SmoothingFactor + TargetValue × (1 - SmoothingFactor)
The first blend tree selects between the target-value and current-value sub-trees using the smoothing factor as its parameter. Each sub-tree uses a remember-style feedback loop for its respective value. Because this runs per frame, the smoothing rate depends on frame rate.
Framerate detection
Because animations advance by frame time and animators evaluate once per frame, resetting an animation every frame and measuring how far it advanced via an AAP can detect the approximate frame time.
Official resources
- Playable Layers on Creator Docs
- Animator Parameters on Creator Docs
- Expression Menu and Controls on Creator Docs
- State Behaviors on Creator Docs
- Animation Clip on Unity Manual
- Blend Trees on Unity Manual
Resources
- VRC School: Introduction – Unity Animation
- VRC School: Animation Clips
- VRC School: Types of Animation Clips
- VRC School: Blend Trees
- VRC School: Playable Layers
- VRC School: Radial Puppets
- VRC School: Expression Parameter Mismatching
- VRC School: Advanced Blend Tree Techniques
- VRC School: Combining Layers Using Direct Blend Trees
- VRC School: Animated Animator Parameters
- VRC School: Designing Scale-Friendly Systems