Skip to content

Animation

Control Unity's animation system from the Inspector - trigger states, play clips, and drive parameters without code.

Jungle.Animation covers all three of Unity's animation systems: Animator Controllers, legacy Animation clips, and Timeline (PlayableDirector). Each system has a dedicated command that resolves a target component and runs a composable list of operations against it. Operations can be instant (set a parameter, fire a trigger) or timed (play a state and wait for it to finish). When you need multi-frame behaviors, timed operations self-tick and keep the parent command alive until they complete - no separate process wiring required.


Dependencies

Package Why
Jungle.Core Base interfaces (IProcess, IOperation, IValue<T>), attributes
Jungle.Spatial Transform-related utilities
Jungle.Objects IGameObject target resolution
Jungle.Math SmartFloat, numeric value types

Assembly: Jungle.Animation - namespace Jungle.Animation (effects/operations) and Jungle.Animation.GameDev (values).


Animator Command

The Animator Command is the primary way to interact with an Animator from a command sequence. Instead of writing a separate script for each parameter change, you configure a composable list of operations that all execute against a single Animator target in parallel. Add the operations you need, reorder them in the Inspector, and you are done.

Under the hood, AnimatorCommand extends TargetedCommand<Animator, IAnimatorOperation>. Each operation receives the resolved Animator and a completion callback. Instant operations call back immediately; timed operations (like Animator State) self-tick and call back when finished. The command completes once every operation has reported completion.

[SerializeReference] [JungleClassSelection]
private IProcess animatorCommand;
// Select "Animator Command" from the class picker

Animator Operations

Each operation performs one action on the resolved Animator (they implement IAnimatorOperation internally):

Operation Description Key Fields
Set Trigger Fires a trigger parameter (one-shot signal) triggerName
Set Bool Sets a boolean parameter parameterName, value
Set Float Sets a float parameter (supports SmartFloat for dynamic sources) parameterName, value
Set Int Sets an integer parameter parameterName, value
Play State Plays a specific animator state by name stateName, layerIndex, startNormalizedTime
Animator State Plays a state and completes when the animation finishes stateName, layerIndex, startNormalizedTime, completeOnAnimationEnd

Instant operations (Set Trigger, Set Bool, Set Float, Set Int, Play State) complete in the same frame. The Animator State operation is a timed operation - it self-ticks each frame, checking for animation completion, and keeps the parent command alive until the state finishes.

Operations are stored as a [SerializeReference] list, so you can add, remove, and reorder them in the Inspector.

Example: Trigger an attack animation and set speed

// In your MonoBehaviour or process configuration:
[SerializeReference] [JungleClassSelection]
private IProcess onAttack;
// In the Inspector, select "Animator Command", then add:
//   1. Set Float  -> parameterName: "Speed", value: 1.5
//   2. Set Trigger -> triggerName: "Attack"

At runtime, calling onAttack.Begin(...) sets the speed parameter and fires the attack trigger in a single frame.


Animation Command

The Animation Command follows the same TargetedCommand<TTarget, TOperation> pattern for the legacy UnityEngine.Animation component. It extends TargetedCommand<Animation, IAnimationOperation> and runs a list of IAnimationOperation operations against a single Animation target.

Operation Description Key Fields
Play Clip Plays a legacy Animation clip and completes when it finishes clip, restartFromBeginning

The Play Clip operation is a timed operation - it self-ticks each frame, checking whether the clip is still playing, and keeps the parent command alive until playback completes.

[SerializeReference] [JungleClassSelection]
private IProcess legacyAnimation;
// Select "Animation Command", then add a "Play Clip" operation

Note

This command targets the legacy UnityEngine.Animation component, not the Animator. Use it for simple one-off animations that do not need a full Animator Controller.


Playable Director Command

The Playable Director Command extends TargetedCommand<PlayableDirector, IPlayableDirectorOperation> and runs a list of operations against a single PlayableDirector (Timeline) target.

Operation Description Key Fields
Start Director Starts the PlayableDirector without waiting for completion (fire-and-forget) restartFromBeginning
Play Director Plays the Director and completes when playback finishes restartFromBeginning

Start Director is an instant operation - it kicks off the Timeline and completes immediately. Play Director is a timed operation that listens for the PlayableDirector.stopped event and keeps the parent command alive until playback finishes.

[SerializeReference] [JungleClassSelection]
private IProcess cutscene;
// Select "Playable Director Command", then add a "Play Director" operation

Tip

Use Start Director when you want to kick off a Timeline but do not need to block a sequence on it. Use Play Director when subsequent operations should wait for the Timeline to finish.


Value Providers

Jungle.Animation adds AnimationClip to the value provider system.

IAnimationClipValue / ISettableAnimationClipValue

Interfaces for providing AnimationClip references. Use these as field types when a component needs a clip that could come from different sources.

Concrete Providers

Provider Description When to Use
AnimationClipValue Stores a clip directly on the owning component Simple, single-clip reference
AnimationClipValueFromAsset Reads from an AnimationClipValueAsset ScriptableObject Shared clip reference across multiple objects
AnimationClipListValueFromAsset Reads a list of clips from an AnimationClipListValueAsset Random or indexed clip selection

ScriptableObject Assets

Asset Menu Path Description
AnimationClipValueAsset Jungle/Animation/AnimationClip Value Stores a single AnimationClip
AnimationClipListValueAsset Jungle/Animation/AnimationClip List Value Stores a list of AnimationClip references
// Use in a component field:
[SerializeReference] [JungleClassSelection]
private IAnimationClipValue clip;
// Inspector offers: "Animation Clip Value" (local) or "Animation Clip Value From Asset" (shared)

Animator Float Pipeline

Info

The AnimatorFloatPipeline originated in Jungle.Animation and may be located in a separate assembly in some configurations.

A pipeline process that drives an Animator float parameter over time. It reads from a configurable float target, applies modifiers, and writes the result to the Animator each frame.

Field Type Description
targetAnimatorObject IGameObject The GameObject with the Animator
parameterName IStringValue The float parameter name to drive

Use this to smoothly transition blend tree weights, speed multipliers, or any continuous Animator parameter through the pipeline system.

[SerializeReference] [JungleClassSelection]
private IProcess blendTransition;
// Select "Animator Float Pipeline"
// Set parameterName to "Blend", configure a LerpFloatTarget for smooth transition

Putting It Together

A typical setup for a character that plays an intro animation, then idles:

public class CharacterIntro : MonoBehaviour
{
    [SerializeReference] [JungleClassSelection]
    private IProcess introState;
    // -> Animator Command with operations:
    //      Animator State -> stateName: "Intro", completeOnAnimationEnd: true

    [SerializeReference] [JungleClassSelection]
    private IProcess setIdle;
    // -> Animator Command with operations:
    //      Set Bool -> parameterName: "IsIdle", value: true

    private void Start()
    {
        introState.Begin(onComplete: () =>
        {
            setIdle.Begin();
        });
    }
}

All animation behavior is configured in the Inspector. Swapping the intro from an Animator state to a Timeline is a single dropdown change from "Animator Command" to "Playable Director Command" and adding the appropriate operation - no code modification required.