Animations: Difference between revisions

From VRChat Wiki
Hackebein (talk | contribs)
We use our body to animate our avatars, documenting the advanced options
 
Hackebein (talk | contribs)
 
(5 intermediate revisions by 3 users not shown)
Line 58: Line 58:
* '''1D''' blend trees for scalar controls.
* '''1D''' blend trees for scalar controls.
* '''2D''' blend trees for two-axis controls.
* '''2D''' blend trees for two-axis controls.
* '''Direct''' blend trees for per-motion weight control.
* '''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.
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.
Line 88: Line 88:
* Animated Animator Parameters (AAPs).
* Animated Animator Parameters (AAPs).
* Scale-reactive systems driven by avatar scaling parameters.
* 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 <code>GestureLeftWeight</code>) 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:
<code>CurrentValue = CurrentValue × SmoothingFactor + TargetValue × (1 - SmoothingFactor)</code>
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 ==
== Official resources ==
Line 97: Line 124:
* [https://docs.unity3d.com/Manual/class-BlendTree.html Blend Trees] on Unity Manual
* [https://docs.unity3d.com/Manual/class-BlendTree.html Blend Trees] on Unity Manual


== References ==
== Resources ==
* [https://vrc.school/docs/Unity-Animations/Intro-Unity-Animation VRC School: Introduction – Unity Animation]
* [https://vrc.school/docs/Unity-Animations/Animation-Clips VRC School: Animation Clips]
* [https://vrc.school/docs/Unity-Animations/Animation-Clips VRC School: Animation Clips]
* [https://vrc.school/docs/Unity-Animations/Types-Of-Animations VRC School: Types of Animation Clips]
* [https://vrc.school/docs/Unity-Animations/Types-Of-Animations VRC School: Types of Animation Clips]
Line 108: Line 136:
* [https://vrc.school/docs/Other/AAPs VRC School: Animated Animator Parameters]
* [https://vrc.school/docs/Other/AAPs VRC School: Animated Animator Parameters]
* [https://vrc.school/docs/Other/Scale-Friendly VRC School: Designing Scale-Friendly Systems]
* [https://vrc.school/docs/Other/Scale-Friendly VRC School: Designing Scale-Friendly Systems]
[[Category:SDK]]
[[Category:Needs images]]

Latest revision as of 01:10, 12 June 2026

V · EThis is an official VRChat information page!
It is reviewed and approved by the VRCWiki Team. Learn how to contribute to this page by reading the Contribution Guide.

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

Resources