> For the complete documentation index, see [llms.txt](https://postica.gitbook.io/binding-system-3/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://postica.gitbook.io/binding-system-3/pipeline/tweening.md).

# Tweening and Control

Easing and damping, inside the binding.

A bound value normally follows its source exactly. These modifiers put time between the two: the value moves *toward* the source rather than snapping to it.

That turns a binding into an animation with no animator, no coroutine and no tween library.

{% hint style="success" %}
**Learn by doing:** [Making a Value Follow Smoothly](/binding-system-3/tutorials/smooth-values.md) puts a Tween Animation and a Value Smoother on the same jumping value, side by side.
{% endhint %}

<table><thead><tr><th width="250">Modifier</th><th>What it does</th></tr></thead><tbody><tr><td><strong>Tween Animation</strong></td><td>Eases toward the target over a duration, with an easing function.</td></tr><tr><td><strong>Value Smoother</strong></td><td>Follows the target continuously with damped dynamics. No duration, no overshoot.</td></tr><tr><td><strong>Blend To</strong></td><td>Blends toward a target value by a factor.</td></tr></tbody></table>

Available for `float`, `Vector2`, `Vector3`, `Color` and `Quaternion`, depending on the modifier.

{% hint style="warning" %}
All of these only advance when the binding runs. On a [proxy binding](/binding-system-3/overview/proxy-bindings.md) that means an update point has to be selected, exactly as for any other binding: adding a tween modifier does not select one for you. On a `Bind<T>` field it means your own code has to keep reading the value, or **Auto Update** has to be on. There is no point easing a value that is only read once.
{% endhint %}

## Tween Animation

The one to use when you know how long the movement should take.

<table><thead><tr><th width="250">Setting</th><th>What it does</th></tr></thead><tbody><tr><td><strong>Function</strong></td><td>Linear, Sine, Quad, Cubic, Quart, Quint, Expo, Circ, Back, Bounce, Elastic, or a custom <code>AnimationCurve</code>.</td></tr><tr><td><strong>Ease type</strong></td><td>Ease In, Ease Out, Ease In Out.</td></tr><tr><td><strong>Duration</strong> and <strong>Delay</strong></td><td>In seconds. Both bindable.</td></tr><tr><td><strong>Direction</strong></td><td>Forward, Backward, PingPong, ReversePingPong.</td></tr><tr><td><strong>Repeat count</strong></td><td>How many times. Zero means forever.</td></tr><tr><td><strong>Time scale</strong></td><td>Scaled follows <code>Time.timeScale</code>; Unscaled ignores it, which is what a pause menu wants.</td></tr><tr><td><strong>Origin type</strong></td><td>Where the tween starts from: a precise origin you supply, or the last completed value.</td></tr><tr><td><strong>On target change</strong></td><td>What happens when the target moves mid-tween: <em>Ignore</em>, <em>Restart Animation Time</em>, <em>Restart From Origin</em>, or <em>Adapt Animation</em>.</td></tr><tr><td><strong>Events</strong></td><td><code>UnityEvent</code>s for started, updated and completed.</td></tr></tbody></table>

**On target change** is the setting worth understanding, because a bound target usually *does* move mid-tween.

<table><thead><tr><th width="290">Behaviour</th><th>What it does</th></tr></thead><tbody><tr><td><strong>Ignore</strong></td><td>Finish the current tween, then start a new one. Predictable timing, can lag behind a fast-moving target.</td></tr><tr><td><strong>Restart Animation Time</strong></td><td>Keep the current position, restart the clock toward the new target.</td></tr><tr><td><strong>Restart Animation From Origin</strong></td><td>Jump back to the origin and tween again. Rarely what you want for a continuous value.</td></tr><tr><td><strong>Adapt Animation (Unsafe)</strong></td><td>Retarget without restarting. Smoothest, and labelled unsafe because the easing shape is no longer exactly the curve you chose.</td></tr></tbody></table>

<figure><img src="https://3048705056-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLUfBXR02sJ5i0MxwYbaV%2Fuploads%2FPDGm2b6JyXcilNgMg20Z%2FScreenshot%202026-09-26%20at%2016.02.01.png?alt=media&amp;token=f994ce40-5d93-470e-b46c-8c63d8eedf4d" alt="" width="563"><figcaption><p>The Tween Animation modifier</p></figcaption></figure>

## Value Smoother

The one to use when there is no fixed duration, only "follow this, but smoothly". Damped dynamics, so it converges without overshooting, and it handles a target that changes every frame without any special case.

<table><thead><tr><th width="250">Setting</th><th>What it does</th></tr></thead><tbody><tr><td><strong>Speed</strong></td><td>How fast the value follows the target. Higher is snappier. Range 0.5 to 25, default 8. Bindable.</td></tr><tr><td><strong>Damping</strong></td><td>How smoothly it stops. 1 is critical damping, meaning no overshoot; below 1 overshoots, above 1 is sluggish. Range 0 to 5, default 1. Bindable.</td></tr><tr><td><strong>Delay</strong></td><td>Before the chase starts. Bindable.</td></tr><tr><td><strong>Time scale</strong></td><td>Scaled or unscaled.</td></tr><tr><td><strong>Origin type</strong></td><td>Precise origin, or last completed value.</td></tr><tr><td><strong>On target reached</strong></td><td>Stay at the target, or reset to the origin.</td></tr><tr><td><strong>Target epsilon</strong></td><td>How close counts as arrived. Default 0.001.</td></tr></tbody></table>

This is the right default for camera follow, UI values that jitter, and anything driven by physics or input.

## The easing picker

The ease button on a **Tween Animation** modifier opens a grid that plots every easing function, so you pick by shape rather than by name. **Custom** takes an `AnimationCurve` instead.

<figure><img src="https://3048705056-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLUfBXR02sJ5i0MxwYbaV%2Fuploads%2FzjCwvPcMEA0Rzk4qNJdK%2FScreenshot%202026-09-28%20at%2014.28.47.png?alt=media&amp;token=58e45cb4-0c7d-4c5b-ab05-2e21493ce1ed" alt="" width="563"><figcaption><p>The easing picker, opened from the Tween Animation modifier</p></figcaption></figure>

## Choosing

<table><thead><tr><th width="330">You want</th><th>Use this</th></tr></thead><tbody><tr><td>A UI element to animate in over 0.3 seconds</td><td><strong>Tween Animation</strong>, Ease Out</td></tr><tr><td>A health bar to catch up to a value that keeps changing</td><td><strong>Value Smoother</strong></td></tr><tr><td>A camera to follow a target without jitter</td><td><strong>Value Smoother</strong></td></tr><tr><td>A number to count up to its new value</td><td><strong>Tween Animation</strong>, Linear</td></tr><tr><td>A value to lag behind by a fixed time</td><td><strong>Value Delayer</strong></td></tr></tbody></table>

## Cost

These modifiers are the ones that genuinely run every frame, since that is the point of them. Two things keep the cost down:

* Pick the cheapest [update point](/binding-system-3/overview/modes-and-updates.md) that looks right. **LATE UPDATE** for anything visual.
* Do **not** put them on an [interval](/binding-system-3/overview/modes-and-updates.md#intervals). An animation stepped every four frames is an animation with four times fewer frames, and it looks it. The interval is the one update setting that genuinely breaks them.

{% hint style="success" %}
**Optimized Update is safe with these, and you can leave it on.** A modifier that has work to do between source changes declares itself dynamic, and the pipeline splits in two around it: the part before it is cached against the raw source value, and the part from it onward is re-evaluated on every update. The change check then reports new data every time, so the tween keeps advancing while the cheap half stays cached. This is handled for you; there is nothing to configure.
{% endhint %}
