# Animator Layer

## Overview

An **Animator Layer** is a procedural animation feature, which modifies your character pose in realtime.

{% hint style="success" %}
**Tip:** usually animator layers reside in the **Animator Profile**. The only exception is the **IK Motion Laye**r - this layer counts as an "animation", so you can dynamically link it using:

{% code lineNumbers="true" %}

```
_fpsAnimator.LinkAnimatorLayer(yourLayerHere)
```

{% endcode %}

You can find out more in this section:
{% endhint %}

All layers in the framework has a similar structure, let's take a look at it:

<figure><img src="https://784345943-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxcUmJ78NSw1bSUlSO9oP%2Fuploads%2FVMJ2fP1O7i8qq5Ie9CMD%2Fimage.png?alt=media&#x26;token=dec48698-60f6-47ce-af61-15c1e82417c7" alt="" width="418"><figcaption><p>AttachHandLayer Example.</p></figcaption></figure>

The red highlighted area represents general settings for all animator layers. Let's break them down:

* **Alpha**: controls the influence of the layer; if set to 1 - the layer will be fully applied, and if set to 0 - it will be disabled.
* **Link Dynamically** - defines if this layer will need to be cached when a new profile is linked. If set to true, there will be no smooth blending, but instead the settings will be updated.

## Curve Blending

**Curve Blending** is a crucial part of controlling animation features in realtime. You can select a parameter which will control the layer, so far the system supports these parameter types:

* Animator Controller float parameters.
* Playables curves.
* Input Config variables.

You can also specify the **Blend** parameter, which can be either **Mask** or **Direct**:

<figure><img src="https://784345943-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxcUmJ78NSw1bSUlSO9oP%2Fuploads%2F6BvgtPpudrX92tcNqWvk%2Fimage.png?alt=media&#x26;token=576391fc-89fe-4e3d-ba63-644079b325de" alt=""><figcaption><p>Mode options.</p></figcaption></figure>

* **Mask** means that the value will be applied in reversed mode, computed via: **result = 1f - value.** For example, if the parameter value is 1, the final value will be 0.
* **Direct** mode is going to use the parameter value as is. If the value is 1, the final result will be 1.

It is possible to specify multiple **Curve Blends** in the list, where the top index item will overrides previous ones. **For example**:

<figure><img src="https://784345943-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxcUmJ78NSw1bSUlSO9oP%2Fuploads%2FzsypR3BjfIxozmXCTLFo%2Fimage.png?alt=media&#x26;token=685be9e9-85ec-4099-8229-3aa131a53974" alt="" width="377"><figcaption></figcaption></figure>

If the *FullBodyWeight* value will be 1, the final weight will be 0. However, if P*roneWeight* is 0, the final result will be 0 as well.
